sed/grep 出力パイピングが機能しません。

sed/grep 出力パイピングが機能しません。

次のコマンドを実行すると、out1出力のみが空out2ですout3

# this is just to generate a self-signed certificate
openssl genrsa -out /tmp/ssl.key 2048
openssl req -sha256 -new -key /tmp/ssl.key -out /tmp/ssl.csr -subj /CN=localhost
openssl x509 -req -days 365 -in /tmp/ssl.csr -signkey /tmp/ssl.key -out /tmp/ssl.crt

# works
openssl s_server -cert /tmp/ssl.crt -key /tmp/ssl.key -accept 444 > out1
# does not work, but if I run without '> out2' it works
openssl s_server -cert /tmp/ssl.crt -key /tmp/ssl.key -accept 446 | sed "s/ACCEPT/ACCEPT445/g" > out2
# does not work, but if I run without '> out3' it works
openssl s_server -cert /tmp/ssl.crt -key /tmp/ssl.key -accept 447 | grep ACCEPT > out3

sedまたはgrepでstdoutリダイレクトが失敗し、リダイレクトなしで実行すると機能するのはなぜですか?

答え1

sed -u-lBSD / Mac OSXシステムで)とオプションを試してくださいgrep --line-buffered

答え2

あなたはリアルタイムで期待してout2書かれているように見えますが、パイプでEOFを待っているようです。ここに失敗はありません。out3sedgrep

別のコンソールで終了し、openssl合計に正しい結果があることを確認します。out2out3

関連情報