
パイプとリダイレクトについてもっと深く理解しようとしています。どのガイドにも、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
異なるコマンドで試してみると、同様の結果が得られます。 パイプは平行に走っていますか?
パイプとリダイレクトは内部でどのように機能しますか?
答え1
はい、すべてのコマンドは同時に実行されます。あなたの場合、 はgrep
と同時に起動しますtest.sh
が、 は stdin を読み取るため、 がtest.sh
何かを入力するまでブロックされますが、これは一度には発生しません。2 つのプロセスは互いにペースを合わせており、2 番目のプロセスが遅い場合は、最初のプロセスが stdout 出力バッファに入力し、2 番目のプロセスが何かを読み取るまで待機します。最初のプロセスが遅い場合は、2 番目のプロセスは、入力がない場合に入力を読み取る間ブロックされます。
実際には、最初のプロセスの stdout はかなり大きなチャンク (約 4K) で書き込まれるため(*)、最初のプロセスが少なくとも 4K 相当のデータを書き込むまで、2 番目のプロセスは読み取るものがありません。test.sh
使用方法はecho
少し異なり、行バッファリングされた出力を行うこともできます。
(*) 出力が「tty」(つまり、端末) への出力の場合は、行バッファリングされるというルールがあります。出力に LF があると、実際の出力が発生します。それ以外の場合は、4K のチャンクでバッファリングされます。最初のプロセスでは、すべてのバッファリングを明示的に抑制することもできますが、これはパフォーマンスに悪影響を及ぼします。
答え2
flow control
実際に見ているのは、 、および/または (再)方向と呼ばれるもの、flow control
つまり 、またはstdin
、stdout
(標準入力 / 標準出力) です。
上記の説明が、意図されました何が起こり得るか、そして何ができるか期待する。
パイプ、または「配管」stdout
、単に指示する stdout
ほとんどの場合。
平行は本当に別名タンデム。 あなたはできる試み2つの異なる/同じコマンド/出力を同時に実行します。しかし、同期した発生する可能性は低いため、実行するのは賢明ではありません。
あなたの例に、ここで紹介するのは条件付き道路標識や信号機とほぼ同じです。これらは条件付き(秒)直接 流れに基づいて状態あなたの例では、その間"状態" - その間 これ、 するそれ一般的な条件リダイレクト stdin
、stdout
。
あなたの2つの直接的な質問に直接答えます
- パイプは平行に走っていますか
いいえ、必ずしもそうではありません。少なくとも普通「平行」(タンデム)の意味。
しかし pipe
できる発火する(開始する)2仕事同時に。同じ仕事2回。
- パイプとリダイレクトは内部でどのように機能しますか?
上記でそれをより良く説明できたと思います。:)
または
cat ./ASCII | grep somename >./output
上記cat ./ASCII
は出力(stdout
)。これは入力(stdin
) としてパイプ(|
)は であるgrep somename
。これは(再)リダイレクト( >
) を最終出力にします./output
。