引数を介してコマンドに入力を提供することと、シェルリダイレクト演算子を介して入力を提供することの違いは何ですか?

引数を介してコマンドに入力を提供することと、シェルリダイレクト演算子を介して入力を提供することの違いは何ですか?

シェルのリダイレクト演算子を使用してコマンドに(存在しない)ファイル名を指定すると、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/passwgrepbash

2番目のコマンドは、概念的には、標準出力で指定されたファイルの$ bash-cat /etc/passw | grep 'root'whereジョブを印刷するのと同じです。それからにリダイレクトされます。bash-catcatgrep

$ bash-cat /etc/passw | grep 'root'

bash-cat: /etc/passw: そのファイルやディレクトリはありません

-

パイプについて読んでみるとわかります。 (パイプライン:はじめに)

おすすめ記事