次のコマンドはどちらも、存在しないファイルfoo
を開こうとしますが、エラーメッセージは少し異なります。その理由は何でしょうか?
$ cat foo
cat: cannot open foo
$ cat < foo
-bash: foo: No such file or directory
cat foo
これは、cat
コマンドを引数foo
で実行します。画面に出力されるエラーは、コマンドのプログラマーが何を決定したかに完全に依存します。
cat < foo
Bash stdin redirection を使用して、ファイルfoo
の内容をcat
コマンドにフィードします。ファイルが存在しない場合、それについて不平を言うのはBashです。
$ cat foo
シェル(ここではbash)はcat
コマンドを実行し、パラメーターfoo
を渡します。 catプログラムは、そのパラメーターをファイル名として解釈することを選択し、ファイルを開こうとします。あなたが見るエラーは猫プログラムからのものです(自然に)ファイルを開くことができません。
バージョン $ cat < foo
は、シェルによって処理されるリダイレクトです。 <
は、ファイルを開いてstdinにリダイレクトするようにシェルに指示するシェルオペレーターです。ファイルが存在しないため、「そのようなファイルはありません」と表示されます。今回のエラーはシェル(bash)に由来し、少し異なって見えます。
これが、2つの異なるエラーが表示される理由です。原因は同じですが、2つの異なるプログラム(catとbash)が原因です。