配管とリダイレクトをより深く理解しようとしています。すべてのガイドで、cmd1 | cmd2
cmd1が実行され、stdoutがcmd2のstdinと共有されます。しかし、それは私の頭の中であまり良くないので、私はそれをテストしました:
したがって、。/ test.shとgrepの両方が並列で実行されているように見えます!
ソースコードは次のとおりです。
#!/bin/bash
a=0
while :
do
((a=a+1))
echo "Line number $a"
sleep 1
done
さまざまな表彰で試してみると、同様の結果が得られます。 パイプは並列に走っていますか?
パイプとリダイレクトが「内部」でどのように機能するか?
はい、すべてのコマンドが同時に実行されます。あなたの場合、grep
はtest.sh
と同時に開始しますが、stdinを読み取るため、test.sh
が何かを入れるまでブロックされますが、これはすぐには発生しません。 2つのプロセスは互いにペースを合わせます。2番目のプロセスが遅い場合、最初のプロセスはstdout出力バッファーをいっぱいにし、2番目のプロセスが一部を読み取るまで待機させられます。 1つ目が遅い場合、使用可能なものがない場合、2つ目は入力の読み取り中にブロックされます。
実際には、最初のプロセスのstdoutはかなり大きなチャンク(約4K)(*)で書き込まれるため、最初のプロセスが少なくとも4K相当のデータを書き込むまで、2番目のプロセスは何も読み取ることができません。 echo
を使用するtest.sh
は少し異なり、ラインバッファ出力を行う可能性があります。
(*)出力が「tty」(つまり、ターミナル)に対するものである場合、それはラインバッファリングされるという規則です:出力内のLFは、実際の出力を発生させます。それ以外の場合。 4Kのチャンクによってバッファリングされます。最初のプロセスは、すべてのバッファリングを明示的に抑制することもできますが、これはパフォーマンスに悪影響を及ぼします。
あなたは本当にflow control
、および/または(再)方向と呼ばれるものを見ています-再び; flow control
、またはstdin
、stdout
(標準入力/標準出力)。
上記のステートメントが、意図されたが発生すること、および何がより良く期待されるか。
pipe、または "piping" stdout
、ほとんどの場合、単にdirectsstdout
。
Parallelはreallytandemの別名です。 試行して、2つの異なる/同じコマンド/出力を同時に実行できます。ただし、synchronizedの実行を期待することは、発生する可能性が低いため、賢明ではありません。
あなたの例に;ここでは、条件付きと呼ばれるものを紹介します。道路標識や信号機とほとんど同じです。これらの条件付き(s)直接フロー条件に基づいています。あなたの例では、while "condition" --whilethis、dothat。一般的な条件リダイレクトstdin
、stdout
。
あなたの2つの直接の質問への直接の答えで
いいえ、必ずしもそうとは限りません。少なくとも、normalの「並列」(タンデム)の意味ではありません。
しかしpipe
canfire(initiate)2jobs同時に。 同じジョブ2回ですら。
上記のあなたのためにそれをよりよく説明したと思います。 :)
または
cat ./ASCII | grep somename >./output
上記のcat ./ASCII
は出力(stdout
)です。これは、|
に対してpipe(grep somename
)を経由してinput(stdin
)になります。これは(re)directed(>
)から最終出力./output
になります。