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