次の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
ことができ、名前が表す内部オブジェクトの型を正確に検証するために使用されます。)echo
whence -w
find
外部コマンドなので、組み込みシェルを呼び出すことはできません。実際にシェルの組み込み関数を呼び出す必要がある場合は、シェルを明示的に呼び出してください。
find . -name filename -exec zsh -c 'print "$0"' '{}' \;
この場合、zshの組み込みprint
-in:主な機能が正しく動作することを望まないと思います(zshの組み込み拡張バックスラッシュ)。find
-print
print
find . -name filename -print
(ジョブが指定されていない場合はデフォルトジョブな-print
ので省略することもできます。)-print
find
echo
外部実行ファイルが存在するが呼び出されない理由print
はecho
標準コマンドなので、シェルなしで呼び出そうとするプログラムでも利用率が最大化されるからだ。代わりにprint
zshにのみ適用されるため、最初はzshスクリプトのみを使用してください。
print
(ああ、私のシステムにはファイルをプリンタに送信するコマンドがあります。)
答え2
find
「-exec」で指定したものと一致するコマンドを PATH から検索します。echo
実際にはシステムのバイナリです(私にはそうしました/bin/each
)。
print
これとは対照的に、これはシステム内のバイナリではなくシェル組み込みです(参照してください)。ここ) ここでは find を実行できません。