web-dev-qa-db-ja.com

Linuxパイプシンボル "|"とは行う?

これは、フォルダー内のファイルを逆順に並べ替えるコマンドです

ls | sort -r

そのコマンドの|記号は何をしますか?

ここで私が本当に探しているのは、Linux初心者向けのパイプに関する高レベルの(理解しやすい)説明です。ここでスーパーユーザーのパイプに関する他の質問が表示されますが、パイプの機能とリダイレクトとの違い(>または<記号)を簡単に説明する答えはありません。

22
ccalvert

以下は、新しいユーザーを支援するために少し簡略化されています。

まず、標準入力と標準出力の概念を理解する必要があります。

Linuxおよびその他のUNIXライクなオペレーティングシステムでは、各プロセスに標準入力(stdin)と標準出力(stdout)があります。通常の状況では、stdinがキーボードで、stdoutが画面またはターミナルウィンドウです。

したがって、lsを実行すると、その出力がstdoutにスローされます。他に何もしないと、画面またはターミナルウィンドウに移動して表示されます。

これで、一部のLinuxコマンドがユーザーと対話し、stdinを使用してそれを行います。テキストエディターはその1つです。これは、stdinから読み取ってキーストロークを受け入れ、処理を実行してから、stdoutにデータを書き込みます。

ただし、インタラクティブには機能しないが、大量のデータが必要な非インタラクティブまたは「フィルター」コマンドもあります。これらのコマンドは、stdinが持つすべてのものを取得し、それに何かを実行してから、stdoutにスローします

duと呼ばれる別のコマンドを見てみましょう-ディスク使用量を表します。たとえば、du /usrは、そのディレクトリ内のすべてのファイルとそのサイズのリストを(他のLinuxコマンドと同様にstdoutに)出力します。

# 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

そして、「パイプ」が1つのコマンドのstdoutを別のコマンドのstdinに接続していることがわかります。通常、このような状況では、コマンドの出力をフィルター処理、並べ替え、または操作する必要があります。複数のフィルタータイプのコマンドを使用して出力を処理する場合は、カスケードすることができます。

sortを単独で入力した場合でも、stdinから読み取ろうとします。 stdinがキーボードに接続されているので、Ctrl-Dを押すまでは、タイプ入力と処理を待機しています。インタラクティブに使用するためのものではないため、プロンプトは表示されません。

プログラムがstdinがインタラクティブかどうかを判断することができるため、プログラムを単独で発行したり、パイプの最後で発行したりすると、プログラムの動作が異なる場合があります。

また、viのように、対話形式でのみ機能するプログラムをパイプ処理すると、悪い時間が発生します。

パイプは、データがどこにも保存されずに1つのコマンドから次のコマンドにシャッフルされるという点で、リダイレクトとは異なります。したがって、上記の例では、duの出力はどこにも保存されません。パイプを使用する理由は何らかの方法でコマンドの出力を処理するためであるため、これをパイプで使用したくない場合の大部分はですが、teeコマンドを使用して、ケーキを食べて食べることもできます。 stdinから受け取ったものをstdoutと選択したファイルの両方にコピーします。また、bashから、アンパサンドや角かっこなど、わからない構文を使用してこれを行うこともできます。

26
LawrenceC

出力と入力のリダイレクトに慣れている場合、説明は非常に簡単です。

Command1 | Command2

同じことをする

Command1 > tempfile
Command2 < tempfile

tempfileなし。 Command1の出力はCommand2の入力に直接接続され、転送はメモリ内で行われます。

27
Daniel B

パイプが何をしているか、>と|の違いを知りたい場合は、多くのファイルがあるディレクトリに移動し、

端末からls vs ls | more(またはWindowsからDIRおよびDIR | MOREを使用してそれを行う)

> moreを使用すると、lsの出力を「more」コマンドに送信するのではなく、「more」というファイルが作成されることがわかります。だから、誰かがやったら、おそらくそれは間違いだろう。もっとよく知られているコマンドです。

>のような<は、コマンドとコマンドではなく、コマンドとファイルをリンクするためのものでもあります。ただし、>はコマンドの出力をファイルに送信しますが、<はコマンドへの入力としてファイルを送信します。通常はcat file1を使用するため、<を使用することはほとんどありません|ファイルの出力をコマンドに送信します。

$ grep a <file1 abc

$ cat file1 | grep a abc

2つのパラメーターを持つgrepは、grepパターンファイルの形式です。 1つのパラメーターを持つgrepはgrepパターンです。また、ファイルの内容をパイプするか、<を使用して、ファイルを送信できます。 <を使用する場合は、最初にコマンド名、次にコマンド<ファイルの後にファイル名を記述します。 |を使用する場合ファイルの内容をパイプ処理するには、cat file1 |を使用します。コマンド。

また、多くのコマンドは入力としてファイルをとるので、gfile a file1はcat file1 |と同じように機能します。 grep a、およびgrep a <file1。

15年前にもDOSでパイプ(|)と>を実行していました。

と<および>の違いをまとめると-パイプは2つのコマンドの間に位置します<と>はコマンドとファイルの間に位置します。>はファイルに出力されます。<はファイルからの入力。

3
barlop

パイプ文字(|)は、1つのプログラムの出力を別のプログラムの入力に接続します。

この例では、echoはWordを出力しますhello、およびwc -cはその入力の文字カウントを行います:

echo hello | wc -c
3
bbaassssiiee

これを理解するために、自分で試してください:

sort -r

今、あなたはカーソルでぶら下がっていて、それは何もしていません。データを入力するとどうなりますか?

1
2
3
5
4

まだ何もないですよね? Ctrl + Dを押します

5
4
3
2
1

つまり、並べ替えとは、入力(ユーザーが入力したもの)を受け取り、それを使用して(並べ替え)、出力として返すことです。 lsコマンドは入力を取りません。出力を生成するだけです。パイプ記号はlsから出力を受け取り、sortコマンドへの入力としてフィードします。

>は出力をプログラムにフィードしませんが、出力をファイルとして保存します。 <は、入力としてファイルを使用します。

2
jornane