の早期の部分を待たずにシェルスクリプトを終了し、次のスクリプトを考えてみましょう:は、パイプライン
#!/bin/bash
function long_running {
for i in $(seq 1 10); do
echo foo
sleep 100
done
}
long_running | head -n 1
これが終了する前に、予想される出力(1行「foo」という)が、(指定された100秒間)スリープを生成します。私は頭がするときにスクリプトがすぐに終了するようにしたいと思います。どのようにして実際にbashを強制終了することができますか?最後の行を変更しても
long_running | (head -n 1; exit)
またはそれに類するものは動作しません。 (head -n 1; false)
などでエラーを強制しても、私はset -e
、別の一般的な提案を得ることができません。
(これは私の実際のコードを簡略化したものです(明らかに)スリープ状態ではありません;複雑なネストされたパイプラインを作成して、制約問題に対するさまざまな解決策を探しています。このように頭に送信機能について、私は、私はスクリプトが呼び出しにhead -n 1
を追加することによって終了させることができるようにしたいと思いますケア...)
この例では、 'sleep 100'はスクリプトのサブプロセスであり、今はPIDを他のプロセスに伝えて殺すことができるため、誤解を招きます。 しかし、この 'sleep 100'は実際にコードブロックであると書いてありますので、この例のこの部分を' sleep 1'のFORループとして100回繰り返すように書き直すことをお勧めします。 – karatedog
そのパイプラインに長時間実行しているコマンド(シェル関数さえも)がある場合、それはまだサブプロセスです。しかし、あなたの例は同じ問題を作り出します、はい。 –