出口

2013-01-11 9 views
10

は、Control-Cまたはスクリプトが正常に終了した場合のいずれか、私は一度火にfdをしたいと思い、このスクリプト出口

#!/bin/sh 

fd() 
{ 
    echo Hello world 
    exit 
} 

trap fd EXIT INT 

for g in {1..5} 
do 
    echo foo 
    sleep 1 
done 

してください。ただし、Control-Cを押すと2回実行されます。これをどうすれば解決できますか?

答えて

9

カスケードトラップを実行します。あなたは

#!/bin/sh 

fd() { 
    echo Hello world 
    # No explicit exit here! 
} 

trap fd EXIT 
trap 'exit 127' INT 

は、私が数年前から問題に様々な回避策に苦しんでた後、他の人のスクリプトからこのことを学んで覚えていると言うことができるようにexit 127は、EXITトラップを実行し、127に終了コードを設定します。その後、私はいくつかのチュートリアルでこのテクニックを説明していることに気付きました。しかし、それは明確に文書化されていない。 BashマニュアルページIMHO。 (または、それが必要なときではありませんでした.15年後には変化しないかもしれません...:

+0

とてもいいです、+1 :) – drAlberT

0

#!/bin/sh 

fd() { 
    echo Hello world 
    trap - EXIT 
    exit 127 
} 

trap fd INT EXIT