出力と入力のリダイレクトに慣れている場合、説明は非常に簡単です。
Command1 | Command2
と同じです
Command1 > tempfile
Command2 < tempfile
tempfile
なし . Command1
の出力 Command2
の入力に直接接続されています 転送はメモリ内で行われます。
以下は、新しいユーザーを助けるために少し簡略化されています.
まず、標準入力と標準出力の概念を理解する必要があります。
Linux やその他の UNIX ライクなオペレーティング システムでは、各プロセスに標準入力 (stdin
) があります。 ) と標準出力 (stdout
)。通常の状況は stdin
です はキーボードで stdout
画面または端末ウィンドウです。
ls
を実行すると 、出力を stdout
にスローします .他に何もしなければ、画面または端末ウィンドウに移動し、表示されます。
現在、いくつかの Linux コマンドはユーザーと対話し、 stdin
を使用します そのためには、テキスト エディターがその 1 つです。 stdin
から読み取ります キーストロークを受け入れ、何かを行い、stdout
に何かを書き込みます .
ただし、対話的には機能しないが大量のデータが必要な非対話型または「フィルター」コマンドもあります。これらのコマンドはすべての stdin
を受け取ります 持っている場合は、何かを行ってから stdout
にスローします
du
という別のコマンドを見てみましょう。 - ディスク使用量を表します。 du /usr
、たとえば、(stdout
に)出力されます 他の Linux コマンドと同様) そのディレクトリ内のすべてのファイルのリストとそのサイズ:
# du /usr
2312 /usr/games
124 /usr/lib/tc
692 /usr/lib/rygel-1.0
400 /usr/lib/apt/methods
40 /usr/lib/apt/solvers
444 /usr/lib/apt
6772 /usr/lib/gnash
すぐにわかるように、それはソートされていません。おそらく、サイズ順にソートする必要があります。
sort
stdin
から大量のものを取得する「フィルター」コマンドの 1 つです。
したがって、これを行うと:
# du /usr | sort -nr
私たちはこれを取得します, これは少し良いです:
4213348 /usr
2070308 /usr/lib
1747764 /usr/share
583668 /usr/lib/vmware
501700 /usr/share/locale
366476 /usr/lib/x86_64-linux-gnu
318660 /usr/lib/libreoffice
295388 /usr/lib/vmware/modules
290376 /usr/lib/vmware/modules/binary
279056 /usr/lib/libreoffice/program
216980 /usr/share/icons
そして、「パイプ」が stdout
を接続していることがわかります。 stdin
への 1 つのコマンドの 別の。通常、このような状況で、コマンドの出力をフィルター処理、並べ替え、またはその他の方法で操作する場合に使用します。複数のフィルター タイプのコマンドを介して出力を処理する場合は、それらをカスケードできます。
sort
と入力すると stdin
から読み取ろうとします。 . stdin
以降 がキーボードに接続されている場合は、Control-D を押すまで入力と処理を待機します。インタラクティブに使用することを意図していないため、プロンプトは表示されません。
プログラムが stdin
かどうかを判断することは可能です。 はインタラクティブかどうかに関係なく、一部のプログラムは、単独で、またはパイプの最後で発行すると、異なる動作をする可能性があります。
また、vi
のように、対話的にのみ動作するプログラムをパイプします。 、あなたは悪い時間を過ごすことになります.
パイプは、データがどこにも保存されることなく、あるコマンドから次のコマンドにシャッフルされるという点で、リダイレクトとは異なります。したがって、上記の例では、 du
の出力はどこにも保存されません。ほとんどの場合、パイプを使用する理由はコマンドの出力を何らかの方法で処理するためです。ただし、コマンド tee
があります。 stdin
から受け取ったものをコピーします。 stdout
の両方に そしてあなたが選んだファイル。 bash
からこれを行うこともできます 私が知らないアンパサンドとブラケットを含む難解な構文を使用しています.
パイプの機能と> と | の違いを本当に知りたい場合は、多くのファイルがあるディレクトリに移動し、
端末 ls
から vs ls | more
(または Windows から DIR と DIR を使用してそれを行う | 詳細)
> more を使用すると、ls の出力を「more」コマンドに送信するのではなく、「more」というファイルが作成されることがわかります。したがって、誰かが>more を実行した場合、それはおそらく間違いであり、誰も実行しません。 more はよく知られたコマンドです。
<のような> も、コマンドとコマンドではなく、コマンドとファイルをリンクするためのものです。ただし、> はコマンドの出力をファイルに送信しますが、<はコマンドへの入力としてファイルを送信します。 <は通常 cat file1 | を使用するため、めったに使用しません。ファイルの出力をコマンドに送信します。
$ grep a
$ 猫ファイル1 | grep aabc
2 つのパラメータを持つ grep は、grep パターン ファイルの形式です。 1 つのパラメーターを持つ grep は、grep パターンです。また、ファイルの内容をパイプするか、<. <を使用する場合は、最初にコマンド名を書き、次にファイル名を so command
また、多くのコマンドはファイルを入力として受け取るため、 grep a file1 は cat file1 | と同じように機能します。 grep a、および grep a
15 年前から DOS でパイプ (|) と> を実行していました。
方法を要約すると | <および> - とは異なります パイプは 2 つのコマンドの間にあります <と> はコマンドとファイルの間にあります。> はファイルに出力されます。 <はファイルからの入力です。