配管とリダイレクト?の正確な違いは何ですか?
どこで配管を使用し、どこでリダイレクトを使用する必要がありますか?
それらは内部的にどのように機能しますか?
リダイレクトは(ほとんど)ファイル用です(ファイルとの間でストリームをリダイレクトします)。
Pipingはプロセス用です。あるプロセスから別のプロセスにストリームをパイプ(リダイレクト)します。
基本的に、実際に行うことは、あるプロセスの1つの標準ストリーム(通常はstdout
)を別のプロセスの標準ストリーム(通常はstdin
)にパイプ経由で「接続」することです。
パイプには同期「副作用」もあります。一方のプロセスが(まだ)書き込むものがない場合、または読み取りプロセスが読み取ることができない場合、(読み取り時に)一方のプロセスをブロックします十分に高速 (パイプのバッファーがいっぱいの場合)。
配管は、プログラムの出力を別のプログラムに転送します。
例えば:
ls * | grep "name"
現在のディレクトリ内のすべてのファイルの名前をgrepにパイプします。リダイレクトは、出力をファイルに転送または追加します。
ls * > file # writes all file names in current directory to the "file"
ls * >> file # appends all files names in current directory to the "file"
パイピングを使用すると、ファイルに書き込んでからファイルから読み取って、別のプログラムの出力でプログラムを実行する手間が省けます。
ls * > file
grep "name" file
と同等です
ls * | grep "name"
それらが内部でどのように機能するかについては、私は今自分自身を学んでいるだけです。しかし、私はそれについてのいくつかの議論を提供するこのリンクを見つけました。
プログラム間で出力を渡したい場合は、パイプを使用する必要があります。ファイルに書き込む場合は、リダイレクトを使用します。
基本的に、リダイレクトとパイピングは、Unixでプロセス間通信を実現するための多くの方法のいくつかです。
ls > FileName
ls | grep $myName
これは、プロデューサーやコンシューマーなどの単純なデータ共有で機能します。
プロパティの比較:パイピングは常に単方向ですが、リダイレクトは出力だけでなく入力のリダイレクトにも使用できます。
ls > grep myFileName
[最初のコマンドの出力を後のコマンドにリダイレクトする] sort < fileName.txt
[コマンドソートへの入力としてfileName.txtファイルをリダイレクトする]
以下に記述して、単一のステートメントで双方向リダイレクトを使用することもできます。
sort < fileName.txt > sortNewFile.txt
Piping
の間、それは常に後のコマンドに提供された最初のコマンドの出力であり、同時にそれを出力します。
ls | grep myName | awk '{ print $NF }'
[1つのステートメントで複数の配管]
注1:command > fileName
。 fileName
という名前のコマンドがある場合、リダイレクトの使用が非常に難しくなり、エラーが発生しやすくなります。宛先ファイルのような名前のコマンドがあるかどうかを最初に確認する必要があります。
UnixシステムでIPC)を実現する他の方法は次のとおりです。
リダイレクト:コマンドの出力(stdout
および/またはstderr
)をファイルに送信します例:ls > your_file
ディレクトリリストの結果をyour_file
という名前のファイルに書き込みます
配管:出力を別のコマンドに送信します。例ls | wc
同じ出力(ディレクトリリスト)を、文字数をカウントするコマンドwc
に送信します。
パイプラインはプロセス置換の出力に適用されますが、リダイレクトには適用されないことに気づきました。
bash-3.2$ echo $'one\ntwo\nthree' | tee >(grep o) | cat > pipe
bash-3.2$ echo $'one\ntwo\nthree' | tee >(grep o) > redirect
bash-3.2$ one
two
bash-3.2$ cat pipe
one
two
three
one
two
bash-3.2$ cat redirect
one
two
three