「ls | grep zip」と「grep zip $(ls)」

「ls | grep zip」と「grep zip $(ls)」

私は拡張/コマンド置換について学習しており、例を調べているときに、これらの 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 zipgrepコマンドは標準入力上のファイル名のリストを確認し、それを検索します。

ではgrep zip $(ls)、シェルはlsコマンドの結果をリスト words として置き換え、これをgrepファイル名引数として扱い、パターン を順番に検索しますzip

重要な注意: ファイル名にスペースが含まれている場合、スペースで区切られた部分は別の引数として扱われ、 No such file or directory エラー。一致するファイルを検索するより安全な方法は、シェルグロブを使用することです。例:grep 'pattern' *zip*

関連情報