Linuxパイプ記号「|」は何をしますか?[複製]


23

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

ls | sort -r

|そのコマンドのシンボルは何をしますか?

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


7
これはLinux(カーネル)とは関係ありません。パイプは一般に入出力をリダイレクトする手段であり、bashのようなシェルでは違いはありません。aについて特別な|ことは、名前を使用しないことです。l-handコマンドからの出力は、パイプのr-hand側のコマンドの入力に直接渡されます。
アンドンM.コールマン

この件に関する歴史の教訓については、linfo.org / pipe.html
Fredrik Pihl

ls -1r(一番の引数に注意してください)はに類似した結果を生成するはずls | sort -rです。
イヴァンチャウ

そのように説明するのが好きです。パイプは1つのコマンドの出力を受け取り、次のコマンドで使用できるようにします。たとえば、できますcat /somefile | grep cool。これによりsomefileの出力が取得され、grepで使用できるようになります。grepは、coolという単語を含むすべての行を出力します。
JohnDoea

回答:


26

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

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

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が1つのコマンドをstdin別のコマンドに接続していることがわかります。通常、このような状況で、コマンドの出力をフィルタリング、ソート、または操作する場合に使用します。複数のフィルタータイプのコマンドを使用して出力を処理する場合は、カスケード接続できます。

自分で入力sortした場合でも、から読み込もうとしますstdin。以来stdin、あなたがコントロール-Dを押すまで、あなたが入力し、プロセス物事するために、キーボードに接続され、それがお待ちしております。実際に対話的に使用するためのものではないため、プロンプトは表示されません。

プログラムstdinが対話型かどうかを判断することは可能です。そのため、プログラムを単独で、またはパイプの最後で発行した場合、プログラムによって異なる動作をする可能性があります。

また、のようviに対話的にのみ動作するプログラムをパイピングすると、あなたが悪い時間を過ごすことになります。

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


これはLinuxやPOSIXに固有のものではないことに注意してください。Windowsのほとんどの(すべて?)シェルもこれを行います。そしておそらく他のOS。
ボブ

Windows の概念stdinstdoutLinux の概念は違いますが、おそらくWindows cmd.exeやPowershellの観点からはそれほど違いはありません。
ローレンス

私はそれがどのように違うのかとても興味があります-説明していただけますか?コメントがいい場所ではない場合は、チャットをすることもできます。
ボブ

1
Win32プログラムには、間違いなく標準の入力と出力があります。たとえば、Win32関数を使用して、プロセスの標準入力、出力、またはエラーハンドルを取得できますGetStdHandle()。生成された[子]プロセスの標準ストリームを.NETでリダイレクトするのも簡単です。これはWin32関数にマップされていると思います(しかし、私はそれを100%確信していません-私はWin32開発者ではありません)。
ボブ14

1
ああ、ここで適切なパラメータ設定することでのWin32の同等、STARTUPINFOのための構造体をCreateProcess()
ボブ14

27

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

Command1 | Command2

と同じ

Command1 > tempfile
Command2 < tempfile

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


私は間違っている可能性がありますが、一時ファイルはパイプ構文にも存在すると思います。名前がないだけです。
Taemyr

3
いいえ、違います。あるコマンドから別のコマンドの入力に出力をパイプする場合、ファイルシステム操作は関係しません。
ダニエルB

1
ただし、DOS(およびほとんどの場合Windows)では、パイプによって一時ファイル作成されます。* nixではありませんが、違いはありません。
ジェレミーJスターチャー

これは正しくないと確信しています。プロセスモニターは、お客様の申し立てを拒否するCreateFileか、WriteFileコールすることを報告します。/ edit:もちろん、これはWindowsの部分です。
ダニエルB

3

本当にパイプが何をするのか、そして>と|の違いを知りたいなら、たくさんのファイルがあるディレクトリに行き、

ターミナル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 |を使用します。コマンド。

また、多くのコマンドは入力としてファイルを受け取るため、grep a file1はcat file1 | grep a、およびgrep a <file1。

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

方法をまとめるには| <と>とは異なり ます- パイプは2つのコマンドの間にあります<と>はコマンドとファイルの間にあります。>はファイルに出力されます。<はファイルからの入力です。


3

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

この例では、echo単語を印刷しhello、そしてwc -cその入力の文字数を行います。

echo hello | wc -c

エコーは "hello \ n"を出力するとすぐに言うべきだと思います。あなたはOPに勉強するように言っているのではなく、あなたの答えを読むすべての人にこれを伝えているのです。なぜこの時間の無駄を増やすのですか?
ロドリゴ

フィードバックをありがとう、答えを短くしました。
-bbaassssiiee

2

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

sort -r

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

1
2
3
5
4

まだ何もありませんよね?ctrl + Dを押します

5
4
3
2
1

並べ替えは、入力(入力したもの)を受け取り、それを使用して(並べ替え)、出力として返します。lsコマンドが入力を取らない、それだけで出力を生成します。パイプシンボルはからの出力を受け取り、lsそれをsortコマンドへの入力として送ります。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.