2016-01-31 5 views
16

Bashスクリプトを実行すると、Helloと表示されます。代わりに、空白行を出力して終了します。エコーコマンドでパイプが機能しない

echo 'Hello' | echo 

なぜechoからecho仕事にないpiping出力していますか?

+2

2番目の 'echo'が' cat'のように振る舞うと思っているようです。 –

答えて

25

echoはすべての引数を出力します。 stdinからは読み込まれません。だから、二echoプリント引数(なし)と出口の全ては、stdinHelloを無視します。

$ echo Hello | cat 
Hello 
+1

または '$ echo Hello | xargs echo'これは 'echo Hello |と同じです。デフォルトでは「xargs」です。 – daGo

2

echo(組み込みおよび/bin/echo両方)stdinから何かを読んでいないので、それは次のようになります。そのstdinを読み取り、stdoutに、catを使用することを印刷したプログラムについては

。代わりに

使用cat

echo 'Hello' | cat 
Hello 

有無にかかわらず、パイプ:

cat <<< 'Hello' 
3

配管は、標準入力からの入力を取るコマンドに対してのみ行うことができます。しかし、エコーは標準からはかからない。引数から入力を受け取り、それを出力します。だからこれはうまくいかない。あなたは何かをエコーすることができますecho $(echo 'hello')

8

あなたはパイプを理解していないようです。この場合、彼らは名前がないので匿名のパイプとしてより正確に知られています(名前付きパイプもあります)。匿名パイプは、関連するプロセス間でのみ機能します(たとえば、同じ親を持つプロセスなど)。

パイプは、Cランタイムライブラリから生じるIOシステムの一部です。がバッファリングされているこれらのストリームは、デフォルトでは(例外あり)。基本的にパイプは、出力バッファをあるプロセスから別のプロセスの入力バッファに接続するだけです。使用

最初の3つのストリームは、標準入力、またはstdin(Cで使用される名前)として知られており、0、まず、1を0に番号が付けられている(ファイルディスクリプタと呼ばれる)、および2。デフォルトでは、キーボードに接続されているが、それは<シンボルやパイプの右側にあるプログラム名のいずれかを使用してリダイレクトすることができます。

秒、1は、標準出力、又はstdoutとして知られています。デフォルトでは、端末画面に接続されているが、>シンボルまたはパイプの左側にあるプログラム名を使用してリダイレクトすることができます。

ので:

echo 'Hello' | echo 

echoからの標準出力を受け取り、echoの標準入力に渡します。しかしechoはstdinを読みません!だから何も起こらない。

フィルタプログラムは、コマンドラインで指定されたファイル名を処理します。ファイル名が与えられていなければ、stdinを読み込みます。例としては、cat,grep、およびsedがありますが、ではなく、echoです。例えば:(それはしばしばある)

echo 'Hello' | cat 

は、 'こんにちは' と表示され、catは無用です。

echo 'Hello' | cat file1 

echoから出力を無視して、ファイルfile1の内容を表示します。 stdinは、ファイル名が指定されていない場合にのみ読み込まれることに注意してください。

これはどのように表示されると思いますか?

echo 'Hello' | cat < file1 file2 

なぜですか?最後

、第三の流れ、2、標準誤差、又はstderrと呼ばれ、これは、バッファなしです。パイプでは無視されます。これはstdinとstdoutの間でのみ動作するためです。しかし、あなたは(man dup2を参照)標準出力を使用するように標準エラー出力をリダイレクトすることができます

myprog 2>&1 | anotherprog 

2>&1は「FIE記述子1と同じ場所にファイルディスクリプタ2をリダイレクトする」を意味します。

上記は正常な動作ですが、必要に応じてすべてのプログラムを上書きできます。たとえば、ファイル記述子2から読み取ることができます。私はプロセス置換ここに文書のようなリダイレクトの他の形式を含む他の多くの詳細を省略しました。

関連する問題