zshで-execを探す:エコーは期待どおりに機能しますが、印刷は機能しません。

zshで-execを探す:エコーは期待どおりに機能しますが、印刷は機能しません。

次の2つのコマンドが同じ結果を出力すると思いましたが、そうではありません。

コマンド1:

探す。 -name ファイル名-exec print '{}' \;

コマンド2:

探す。 -name ファイル名-exec echo '{}'\;

実際、コマンド2期待どおりに動作します。filename以下のすべてのインスタンスの相対パスを印刷します。.

しかしコマンド1出力からできるだけ多くの行を取得します。コマンド2しかし、パスを提供する代わりに、各行には次のように表示されます。

find: print: No such file or directory

また、{}の周りの引用符を削除してみました。

2番目のコマンドが期待どおりに機能しないのはなぜですか?なぜ各インスタンスのパスを印刷しないのですかfilename

答え1

比較:

% whence -a print
print
% whence -a echo
echo
/bin/echo

printこれは、組み込みプログラムとしてのみ存在するが、組み込みechoプログラムと実行可能ファイルの両方として存在することを示します。 (実際には上記のようにエイリアス、関数、または予約語にするprintことができ、名前が表す内部オブジェクトの型を正確に検証するために使用されます。)echowhence -w

find外部コマンドなので、組み込みシェルを呼び出すことはできません。実際にシェルの組み込み関数を呼び出す必要がある場合は、シェルを明示的に呼び出してください。

find . -name filename -exec zsh -c 'print "$0"' '{}' \;

この場合、zshの組み込みprint-in:主な機能が正しく動作することを望まないと思います(zshの組み込み拡張バックスラッシュ)。find-printprint

find . -name filename -print

(ジョブが指定されていない場合はデフォルトジョブな-printので省略することもできます。)-printfind

echo外部実行ファイルが存在するが呼び出されない理由printecho標準コマンドなので、シェルなしで呼び出そうとするプログラムでも利用率が最大化されるからだ。代わりにprintzshにのみ適用されるため、最初はzshスクリプトのみを使用してください。

print(ああ、私のシステムにはファイルをプリンタに送信するコマンドがあります。)

答え2

find「-exec」で指定したものと一致するコマンドを PATH から検索します。echo実際にはシステムのバイナリです(私にはそうしました/bin/each)。

printこれとは対照的に、これはシステム内のバイナリではなくシェル組み込みです(参照してください)。ここ) ここでは find を実行できません。

関連情報