シェルのリダイレクト演算子を使用してコマンドに(存在しない)ファイル名を指定すると、grep
シェルはファイルが存在しないというエラーメッセージを表示します。ただし、コマンドに引数として同じファイル名を指定すると、grep
コマンド自体は対応するエラーメッセージを表示しますgrep
。なぜそんなことですか?
ここに私が言う内容のデモがあります。コマンドを実行するとき:
$ grep 'root' /etc/passw
次のエラーメッセージが表示されます。
grep: /etc/passw: No such file or directory
ただし、シェルリダイレクトを介してこのようにコマンドを実行すると、次のようになります。
$ grep 'root' < /etc/passw
代わりに、次のエラー メッセージが表示されます。
bash: /etc/passw: No such file or directory
入力ファイル名を指定するこの2つの方法の違いは何ですか?これを行うにはどういう意味ですか?
ベストアンサー1
最初のコマンド($ grep 'root' /etc/passw
)で引数を指定すると、grep
それをファイル名として解釈して検索します。これgrep
は失敗するので、何が起こったのか教えてくれます。 grepは入力を解釈し、それに対して機能します。
2番目のコマンド()はgrep 'root' < /etc/passw
シェル(ここ:)を標準入力にbash
パイプします。 ()が見つからなかったので、これをあなたに伝えます。ここでbashはユーザーの入力を解釈し、それに応じてアクションを取ります。/etc/passw
grep
bash
2番目のコマンドは、概念的には、標準出力で指定されたファイルの$ bash-cat /etc/passw | grep 'root'
whereジョブを印刷するのと同じです。それからにリダイレクトされます。bash-cat
cat
grep
$ bash-cat /etc/passw | grep 'root'
bash-cat: /etc/passw: そのファイルやディレクトリはありません
-
パイプについて読んでみるとわかります。 (パイプライン:はじめに)