次のコマンドシーケンスを含むパイプラインブロック

次のコマンドシーケンスを含むパイプラインブロック

URLを含むファイルを読み取り、IPアドレスを印刷するスクリプトがあります。ただし、コマンドを追加するとパイプがブロックされる理由のリソースが見つかりません。

cut -d" " -f4 

パイプの端に。これは完全なコマンドです。

for url in $(cat urls); do host $url; done | grep "has address" | cut -d" " -f4

出力はgrepコマンドまで非同期に印刷されます。 grep以降のコマンドの出力は、ホストコマンドがすべてのURLを処理するまでブロックされます。なぜこれが起こるのか教えてくれる人がいますか?

ベストアンサー1

grep端末に書き込まないと、出力はバッファリングされます。を使用すると、grep --line-buffered各ラインをすぐに出力できます。考慮する:

遅い出力コマンドを実行し、端末でgrepを実行します。

$ for i in {1..3}; do
>   echo printing >&2
>   echo to grep
>   sleep 1
> done | grep to
printing
to grep
printing
to grep
printing
to grep

遅い出力コマンドを実行し、カットに対してgrepを実行します。

$ for i in {1..3}; do
>   echo printing >&2
>   echo to grep
>   sleep 1
> done | grep to | cut -d" " -f1-2
printing
printing
printing
to grep
to grep
to grep

遅い出力コマンドを実行し、切り取りオプションを使用してgrepを実行します--line-buffered

$ for i in {1..3}; do
>   echo printing >&2
>   echo to grep
>   sleep 1
> done | grep --line-buffered to | cut -d" " -f1-2
printing
to grep
printing
to grep
printing
to grep

おすすめ記事