web-dev-qa-db-ja.com

配管とリダイレクト

配管リダイレクト?の正確な違いは何ですか?

どこで配管を使用し、どこでリダイレクトを使用する必要がありますか?

それらは内部的にどのように機能しますか?

26
Vikram

リダイレクトは(ほとんど)ファイル用です(ファイルとの間でストリームをリダイレクトします)。

Pipingはプロセス用です。あるプロセスから別のプロセスにストリームをパイプ(リダイレクト)します。

基本的に、実際に行うことは、あるプロセスの1つの標準ストリーム(通常はstdout)を別のプロセスの標準ストリーム(通常はstdin)にパイプ経由で「接続」することです。

パイプには同期「副作用」もあります。一方のプロセスが(まだ)書き込むものがない場合、または読み取りプロセスが読み取ることができない場合、(読み取り時に)一方のプロセスをブロックします十分に高速 (パイプのバッファーがいっぱいの場合)。

29
sirgeorge

配管は、プログラムの出力を別のプログラムに転送します。

例えば:

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"

それらが内部でどのように機能するかについては、私は今自分自身を学んでいるだけです。しかし、私はそれについてのいくつかの議論を提供するこのリンクを見つけました。

Linuxで配管はどのように機能しますか?

プログラム間で出力を渡したい場合は、パイプを使用する必要があります。ファイルに書き込む場合は、リダイレクトを使用します。

8
kiwicomb123

基本的に、リダイレクトとパイピングは、Unixでプロセス間通信を実現するための多くの方法のいくつかです。

  1. リダイレクト:データは一般的なUNIXファイルに書き込まれ、そこから読み取られます。任意の数のプロセスが相互運用できます。これは、大きなデータセットを共有するときに使用する必要があります。

ls > FileName

  1. Piping:Pipingは、あるプロセスの出力が別のプロセスの入力になるプロセスです。それらは、Unixオペレーティングシステムの最も原始的な形式で進化しました。これらは、同じシステム内のプロセス間の通信の一方向フローを提供します。パイプは、ファイル記述子のペアを作成するパイプシステムコールを呼び出すことによって作成されます。 [ファイル記述子については http://www.bottomupcs.com/file_descriptors.html を読んでください]

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 > fileNamefileNameという名前のコマンドがある場合、リダイレクトの使用が非常に難しくなり、エラーが発生しやすくなります。宛先ファイルのような名前のコマンドがあるかどうかを最初に確認する必要があります。

UnixシステムでIPC)を実現する他の方法は次のとおりです。

  1. 名前付きパイプ
  2. 信号
  3. 共有メモリ
  4. ソケット
3
Piyush Baijal

リダイレクト:コマンドの出力(stdoutおよび/またはstderr)をファイルに送信します例:ls > your_fileディレクトリリストの結果をyour_fileという名前のファイルに書き込みます

配管:出力を別のコマンドに送信します。例ls | wc同じ出力(ディレクトリリスト)を、文字数をカウントするコマンドwcに送信します。

1

パイプラインはプロセス置換の出力に適用されますが、リダイレクトには適用されないことに気づきました。

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
1
robert