Bash
スクリプトを実行すると、Hello
と表示されます。代わりに、空白行を出力して終了します。エコーコマンドでパイプが機能しない
echo 'Hello' | echo
なぜecho
からecho
仕事にないpiping
出力していますか?
Bash
スクリプトを実行すると、Hello
と表示されます。代わりに、空白行を出力して終了します。エコーコマンドでパイプが機能しない
echo 'Hello' | echo
なぜecho
からecho
仕事にないpiping
出力していますか?
echo
はすべての引数を出力します。 stdin
からは読み込まれません。だから、二echo
プリント引数(なし)と出口の全ては、stdin
にHello
を無視します。
$ echo Hello | cat
Hello
または '$ echo Hello | xargs echo'これは 'echo Hello |と同じです。デフォルトでは「xargs」です。 – daGo
echo
(組み込みおよび/bin/echo
両方)stdin
から何かを読んでいないので、それは次のようになります。そのstdin
を読み取り、stdout
に、cat
を使用することを印刷したプログラムについては
。代わりに
使用cat
:
echo 'Hello' | cat
Hello
有無にかかわらず、パイプ:
cat <<< 'Hello'
配管は、標準入力からの入力を取るコマンドに対してのみ行うことができます。しかし、エコーは標準からはかからない。引数から入力を受け取り、それを出力します。だからこれはうまくいかない。あなたは何かをエコーすることができますecho $(echo 'hello')
あなたはパイプを理解していないようです。この場合、彼らは名前がないので匿名のパイプとしてより正確に知られています(名前付きパイプもあります)。匿名パイプは、関連するプロセス間でのみ機能します(たとえば、同じ親を持つプロセスなど)。
パイプは、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から読み取ることができます。私はプロセス置換とここに文書のようなリダイレクトの他の形式を含む他の多くの詳細を省略しました。
2番目の 'echo'が' cat'のように振る舞うと思っているようです。 –