2011-12-24 6 views
6

の早期の部分を待たずにシェルスクリプトを終了し、次のスクリプトを考えてみましょう:は、パイプライン

#!/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を追加することによって終了させることができるようにしたいと思いますケア...)

+1

この例では、 'sleep 100'はスクリプトのサブプロセスであり、今はPIDを他のプロセスに伝えて殺すことができるため、誤解を招きます。 しかし、この 'sleep 100'は実際にコードブロックであると書いてありますので、この例のこの部分を' sleep 1'のFORループとして100回繰り返すように書き直すことをお勧めします。 – karatedog

+0

そのパイプラインに長時間実行しているコマンド(シェル関数さえも)がある場合、それはまだサブプロセスです。しかし、あなたの例は同じ問題を作り出します、はい。 –

答えて

3

方法 -

#!/bin/bash 
function long_running { 
    for i in $(seq 1 10); do 
     echo foo 
     sleep 100 
    done 
} 

head -n 1 <(long_running) 

明らかであれば-nを大きくすると、睡眠は始まりますが、頭が完了すると終了しますd。

+0

+1のプロセス置換 – SiegeX

+0

これはうまく動作しているようです、ありがとう!私もパイプライン作業をすることができればいいと思うが、これはうまくいくようだ。 –

+0

(これはなぜ動作するのかはっきりしませんが)... –

関連する問題