STDOUTとSTDINを接続するとはどういう意味ですか?


10

私は本を​​読んでいます、それは言います:

すべてのプロセスには、「標準入力」(STDIN)、「標準出力」(STDOUT)、および「標準エラー」(STDERR)の少なくとも3つの通信チャネルを使用できます。

ほとんどのコマンドは、STDINからの入力を受け入れ、出力をSTDOUTに書き込みます。エラーメッセージはSTDERRに書き込まれます。この規則により、ビルディングパイプラインのようにコマンドを連結して、複合パイプラインを作成できます。

シェルは、シンボルを解釈し<>し、>>命令としてまたはファイルからのコマンドの入力または出力を再ルーティングします。

1つのコマンドのSTDOUTを別のコマンドのSTDINに接続するには| 、一般にパイプと呼ばれる記号を使用します。

ps -ef | grep httpd

つまり、これは基本的に、標準入力はユーザーがファイルに書き込むことができるコマンドであり、標準出力はbashシェルがシェルに出力を書き込むコマンドであり、標準エラーは出力に似ていますが、ファイルシステムにエラーがある場合に呼び出されます。次に、STDOUTとSTDINを接続する部分に行き、私は迷っています。

回答:


25

標準入力と標準出力はコマンドではありません。

組立ラインを備えた工場の機械としてコマンドを想像してください。ほとんどのマシンは、データを入力する1つのコンベヤーベルトとデータを出力する1つのコンベヤーベルトを持つように設計されています。これらはそれぞれ標準入力と標準出力です。標準エラーは、マシンの側面にある開口部で、リジェクトを排出できます。

+-------+     +------------------+       +------------------+     +------+
| input |     |    machine A     |       |    machine B     |     |output|
| reser ­­­|=====|<stdin     stdout>|=======|<stdin     stdout>|=====|bucket|
| voir |    |      stderr      |      |      stderr      |    |      |
+-------+     +------------------+       +------------------+     +------+
                      ||                          ||

上の図は、2台の機械を通過するコンベヤーベルトを示しています。データは左側の入力リザーバーから送られ、マシンAに送られます。出力はさらにマシンB(データが入力される)に送られ、マシンBの出力は右側の出力バケットに格納されます。

UNIXでは、これはパイプラインと呼ばれます。メタファーは配管のメタファーです。パイプはマシンAをマシンBに接続します。上記のパイプラインのシェル構文は次のとおりです。

<input-file.txt commandA | commandB >output-file.txt

< リダイレクト記号は、接続するには、シェルに指示commandAファイルへの標準入力をinput-file.txt起動する前にcommandA。(コマンド名の前後にリダイレクトを置くことができます。)>リダイレクト記号は、シェルにcommandB標準出力をに接続するように指示しoutput-file.txtます。|真ん中のパイプ( " ")記号は、起動する前にcommandAの標準出力をcommandBの標準入力に接続するようにシェルに指示します。

コマンドは複数の入力と複数の出力を持つことができますが、それは別の日の重要事項です。


3
ビジュアルが大いに役立った
JohnMerlino、2012

いいアナロジー。私は何年もの間、ストリームパイプラインの概念を理解してきましたが、どういうわけか、ファクトリー/コンベヤーの類推を使用したことがないため、本当に簡単に(そして簡潔に)理解できます。ありがとうございました!
オーウェンブラッカー

1
素晴らしいアナロジー。よろしければこれをお借りします。
Tivie

Gilles、私はあなたの言い回しについて質問しました:unix.stackexchange.com/q/96724/29146。明確にしてもらえますか?
ストジー

@ギレス-コマンドの前後にリダイレクトを定義するオプションを示す例を含めることができますか?たとえば、パイプラインはinput-file.txt> commandAまたはinput-file.txt <commandAとして読み取ることができますか?
動機付けされた

6

standard input is a command that allows user to write to a file

コマンドではなく、ストリームです。標準の入出力はメールボックスのようなものです。プログラムが起動すると、受信するためのボックスとメールを送信するためのボックスが与えられます。通常、入力はキーボードから行われ、受信ボックスに入れられます。送信ボックスに入れられたメールは、最終的に端末画面に表示されます。

standard output is a command that has the bash shell write output to the shell

プログラムは、標準出力がどこを指しているのか実際には知りません。(のように$ A | B)AをBにパイプすると、Aがメールを送信ボックスに入れると、最終的にBの受信ボックスに入れられます。Bは入力を処理し、独自のメールを送信ボックスに入れます。これは、ターミナルに表示されます。

前述のように、メタフォアを削除するには、標準の入出力はストリームです。メールボックスまたはファイル記述子は、ストリームの一端です。パイプ接続とは、Aの標準をBの標準に接続することです。

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