
次のコマンドの違いは何ですか?
$ input.txt > grep foo
$ grep foo < input.txt
$ cat input.txt | grep foo
$ grep foo input.txt
そしてそれだけではありませんgrep
。他の命令も同じだ。
答え1
input.txt > grep foo
これはバグかもしれません。それは働く注文するinput.txt
そして、出力をというファイルにリダイレクトしますgrep
。これはfoo
コマンドの引数ですinput.txt
。grep foo < input.txt
foo
入力で文字列を見つけますinput.txt
。grep
コマンドラインからファイル名を取得しないため、標準入力で機能します。シェルはファイルの内容input.txt
がgrep
。cat input.txt | grep foo
これは以前と似ていますが、標準入力ストリームはコマンドがファイルの内容を渡すパイプgrep
に接続されます。このコマンドは、標準入力ストリームにパイプされた標準出力ストリームに書き込みます。cat
input.txt
cat
grep
grep foo input.txt
その後、grep
ファイルが開き、その中の文字列をinput.txt
見つけます。foo
標準入力ストリームを使用しません。
一般的に言うと:
Pipe(
|
) は、左側の標準出力ストリームを右側の標準入力ストリームに関連付けます。InputRedirect(
<
) はファイルから標準入力ストリームにリダイレクトします。OutputRedirect(
>
) は標準出力をファイルにリダイレクトします。入力ストリームと出力ストリームは、たとえばを使用して同時にリダイレクトでき、
commandname <inputfile >outputfile
コマンドはパイプに読み書きできますcommand1 | command2 | command3
。リダイレクトとパイプを組み合わせることができます
cat <input.txt | grep foo >output.txt
。
多くのUnixユーティリティは、入力ファイル名をオプションの引数として使用します。ファイル名が指定されていない場合は、標準入力が使用されます。
一部のUnixユーティリティただ標準入力(例tr
:。
Bashやその他のシェル(例ksh
:<<<"string"
ここにある文字列)、ほとんどのシェルは理解していますここのドキュメント(これを見つけてください)。