私はbash関数で表現するには複雑すぎるプログラムを書くためにgolanを使います。プログラムは標準入力を1行ずつ読み取り、変更された出力を標準出力に書き込みます。
stdinメソッドですべての行を繰り返すときの問題は、早く終了しないことです。たとえば、次のコマンドは10行だけでなくすべての行を処理します。
cat largefile | custom-program | head -n 10
デフォルトのUnixアプリケーションをどのように早期にシャットダウンすることができ、カスタムスクリプトでも同じことを行うことができますか?
答え1
では、パイプのもう一方の端が閉じてから(終了時)、次に行が作成されるとyes | head
SIGPIPE信号によって終了します。yes
head
存在する:
(seq 20; sleep 10; seq 10) | head
サブシェルとサブシェルは最初の20行をパイプに書き込み(パイプバッファに収まるため)、問題なく10秒間スリープモードに入ることができます。その間、head
willは死んでいますが、サブシェルがパイプにさらに行を書き込むときにのみ死にます。
戻ってからパイプに最初に書き込むのではなく、コマンドを返したhead
直後に終了するには、次のようにします。head
bash
{ head; kill "$!"; } < <(exec custom-program < large-file)
(bash
そのため、プロセス交換のpidが正確に保存されます$!
。)
また、見ることができます一致するものを見つけた後、Grepはゆっくり終了しますか?より移植性の高いアプローチが欲しい照会出力を制限し、信号13を防止します。に適用されるものの場合find
。
あるいはその逆にこの回答run_under_watch
に似た質問と回答(関数)プロセスが終了すると標準入力壊れたパイプになります。