.bash_profile 함수로 파이프할 수 있나요?

.bash_profile 함수로 파이프할 수 있나요?

명령줄을 사용하여 Apple Finder에서 파일을 강조 표시하는 훌륭한 기능을 받았습니다. 기본적으로 osascript를 둘러싼 래퍼입니다.

나는 출신Mac OS X: 터미널에서 파일 색상 레이블을 변경하는 방법다음과 같습니다.

# Set Finder label color
label(){
  if [ $# -lt 2 ]; then
    echo "USAGE: label [0-7] file1 [file2] ..."
    echo "Sets the Finder label (color) for files"
    echo "Default colors:"
    echo " 0  No color"
    echo " 1  Orange"
    echo " 2  Red"
    echo " 3  Yellow"
    echo " 4  Blue"
    echo " 5  Purple"
    echo " 6  Green"
    echo " 7  Gray"
  else
    osascript - "$@" << EOF
    on run argv
        set labelIndex to (item 1 of argv as number)
        repeat with i from 2 to (count of argv)
          tell application "Finder"
              set theFile to POSIX file (item i of argv) as alias
              set label index of theFile to labelIndex
          end tell
        end repeat
    end run
EOF
  fi
}

나는 그것을 via 에 넣고 vim .bash_profile실행했고 를 source .bash_profile사용하여 함수를 실행할 수 있었습니다 label 2 /Users/brett/Desktop/test.txt. 완벽한.

하지만 이전 PHP mysql_query( 문을 모두 PDO로 업데이트하고 편집해야 하는 파일을 시각적으로 강조 표시하고 싶다면 어떻게 해야 할까요?

평소에는 달리고,

find /Users/brett/Development/repos/my-repo/ -name "*.php" -print0 | xargs -0 grep -Iil 'mysql_query(' | xargs -I '{}' -n 1 label 2 {}

하지만 돌아옵니다.

xargs: label: No such file or directory

달리기를 시도해야 한다는 내용을 읽었 export -f label지만 그것도 도움이 되지 않는 것 같습니다.

.bash_profile 함수 에서 경로/파일을 grep파이프하는 방법을 아는 사람이 있습니까?xargs

답변1

label당신과 대화하려면 xargs다음과 같이 해보세요:

export -f label
find /Users/brett/Development/repos/my-repo/ -name "*.php" -print0 |
  xargs -0 grep -Iil 'mysql_query(' |
  xargs -I {} -n 1 bash -c 'label 2 {}'

label 2 {}함수 xargs를 직접 호출할 수 bash -c 'label 2 {}'없으므로 xargs함수를 label상위 셸의 하위 프로세스로 내보낸 다음 하위 셸을 포크하고 그곳에서 함수를 처리합니다.bash

노트:

  • ~/.bash_profile일반적으로 비로그인 쉘에서는 획득할 수 없으므로 함수를 호출 쉘로 내보내야 export -f label합니다 .labelxargs

  • -c옵션은 bash실행할 명령이 옵션 인수 문자열에서 읽도록 지시합니다.

답변2

반대로 해보는 건 어때요? .xargsxargs

find /Users/brett/Development/repos/my-repo/ -name "*.php" |
  while IFS= read -r file; do grep -Iil 'mysql_query(' "$file" && label 2 "$file"

이 명령은 파일을 찾고 .php, 각 파일을 로 저장하고 $file, 실행하며 grep, grep일치하는 항목이 있으면 해당 파일을 함수에 전달합니다. Mac이 없기 때문에 테스트할 수는 없지만 정상적으로 작동할 것입니다.

답변3

함수가 정의된 쉘 인스턴스 외부에서는 함수를 사용할 수 없습니다. 이 기능은 에 있기 때문에 .bash_profile로그인 쉘에서만 사용할 수 있고, 사용된 쉘에서 시작된 쉘에서는 사용할 수 없습니다. 함수는 다른 프로그램에서 호출할 수 없습니다 xargs.

함수를 시작하기 위해 셸을 호출하는 것에 기반한 솔루션이 있지만 가장 간단한 솔루션은 함수의 코드를 스크립트에 넣는 것입니다. 이렇게 하면 어디서든 호출할 수 있습니다.

독립 실행형 스크립트는 상위 셸에 영향을 미칠 수 없기 때문에 모든 함수가 독립 실행형 스크립트가 될 수는 없습니다(내보내지 않은 변수를 볼 수 없고 상위 셸에서 변수를 설정할 수 없는 등). 여기서 함수는 상위 셸 내에서 실행해야 하는 작업을 수행하지 않으므로 이를 스크립트로 만드는 것이 좋습니다.

관련 정보