web-dev-qa-db-ja.com

配管はコマンドを並行して実行しますか?

配管とリダイレクトをより深く理解しようとしています。すべてのガイドで、cmd1 | cmd2 cmd1が実行され、stdoutがcmd2のstdinと共有されます。しかし、それは私の頭の中であまり良くないので、私はそれをテストしました:

したがって、。/ test.shgrepの両方が並列で実行されているように見えます!

ソースコードは次のとおりです。

#!/bin/bash
a=0
while :
do
        ((a=a+1))
        echo "Line number $a"
        sleep 1
done

さまざまな表彰で試してみると、同様の結果が得られます。 パイプは並列に走っていますか?

パイプとリダイレクトが「内部」でどのように機能するか?

1
Adam Katav

はい、すべてのコマンドが同時に実行されます。あなたの場合、greptest.shと同時に開始しますが、stdinを読み取るため、test.shが何かを入れるまでブロックされますが、これはすぐには発生しません。 2つのプロセスは互いにペースを合わせます。2番目のプロセスが遅い場合、最初のプロセスはstdout出力バッファーをいっぱいにし、2番目のプロセスが一部を読み取るまで待機させられます。 1つ目が遅い場合、使用可能なものがない場合、2つ目は入力の読み取り中にブロックされます。

実際には、最初のプロセスのstdoutはかなり大きなチャンク(約4K)(*)で書き込まれるため、最初のプロセスが少なくとも4K相当のデータを書き込むまで、2番目のプロセスは何も読み取ることができません。 echoを使用するtest.shは少し異なり、ラインバッファ出力を行う可能性があります。

(*)出力が「tty」(つまり、ターミナル)に対するものである場合、それはラインバッファリングされるという規則です:出力内のLFは、実際の出力を発生させます。それ以外の場合。 4Kのチャンクによってバッファリングされます。最初のプロセスは、すべてのバッファリングを明示的に抑制することもできますが、これはパフォーマンスに悪影響を及ぼします。

3
xenoid

あなたは本当にflow control、および/または(再)方向と呼ばれるものを見ています-再び; flow control、またはstdinstdout(標準入力/標準出力)。

上記のステートメントが、意図されたが発生すること、および何がより良く期待されるか

pipe、または "piping" stdout、ほとんどの場合、単にdirectsstdout

Parallelはreallytandemの別名です。 試行して、2つの異なる/同じコマンド/出力を同時に実行できます。ただし、synchronizedの実行を期待することは、発生する可能性が低いため、賢明ではありません。

あなたの例に;ここでは、条件付きと呼ばれるものを紹介します。道路標識や信号機とほとんど同じです。これらの条件付き(s)直接フロー条件に基づいています。あなたの例では、while "condition" --whilethis、dothat。一般的な条件リダイレクトstdinstdout

あなたの2つの直接の質問への直接の答えで

  1. パイプは並列に実行されますか

いいえ、必ずしもそうとは限りません。少なくとも、normalの「並列」(タンデム)の意味ではありません。

しかしpipecanfire(initiate)2jobs同時に。 同じジョブ2回ですら。

  1. パイプとリダイレクトは「内部」でどのように機能しますか?

上記のあなたのためにそれをよりよく説明したと思います。 :)

または

cat ./ASCII | grep somename >./output

上記のcat ./ASCII出力stdout)です。これは、|に対してpipegrep somename)を経由してinputstdin)になります。これは(re)directed>)から最終出力./outputになります。

1
somebody