私は拡張/コマンド置換について学習しており、例を調べているときに、これらの 2 つのコマンドの結果が異なることに気付きました。
たとえば、 に cd して/usr/bin
を実行するとls | grep zip
、grep はファイル名内の「zip」のみを検出します。
grep zip $(ls)
しかし、同じディレクトリで実行すると、grep はファイル コンテンツ内の zip も取得します。なぜでしょうか? Ubuntu 16.04。
初心者の質問だとは思いますが、理由を教えていただけると助かります。ありがとうございます。
答え1
grep
これは、2 つの異なるモードで動作できるためです。
DESCRIPTION grep searches the named input FILEs for lines containing a match to the given PATTERN. If no files are specified, or if the file “-” is given, grep searches standard input. By default, grep prints the matching lines.
ではls | grep zip
、grep
コマンドは標準入力上のファイル名のリストを確認し、それを検索します。
ではgrep zip $(ls)
、シェルはls
コマンドの結果をリスト words として置き換え、これをgrep
ファイル名引数として扱い、パターン を順番に検索しますzip
。
重要な注意: ファイル名にスペースが含まれている場合、スペースで区切られた部分は別の引数として扱われ、 No such file or directory
エラー。一致するファイルを検索するより安全な方法は、シェルグロブを使用することです。例:grep 'pattern' *zip*