.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、実行しgrepgrep一致するものがあればそのファイルを関数に渡します。 Macがないのでテストできませんが、正常に動作します。

答え3

関数が定義されているシェルインスタンスの外部では関数を使用できません。この機能はにあるため、.bash_profileログインシェルでのみ使用でき、使用されているシェルから始まるシェルでは使用できません。関数は他のプログラムから呼び出すことはできませんxargs

関数を起動するためにシェルを呼び出すことに基づく解決策がありますが、最も簡単な解決策は関数のコードをスクリプトに入れることです。これにより、どこでも呼び出すことができます。

スタンドアロンスクリプトは親シェルに影響を与えることはできないため、すべての関数をスタンドアロンスクリプトにすることはできません(エクスポートされていない変数を表示できず、親シェルで変数を設定できないなど)。ここでは、関数は親シェル内で実行する必要がある操作を実行しないため、スクリプトにすることをお勧めします。

関連情報