2012-02-10 8 views
6

正常終了したか中断されたかにかかわらず、特定のbashスクリプトが終了するたびに実行する必要がある汎用クリーンアップコードがあります。私はこれを達成するためにtrap "..." EXIT疑似信号を使うと思った。「トラップ」ブロックの宣言後に変数を検出しないバッシュ信号キャプチャが変更されました

一般的なクリーンアップに加えて、スクリプトが正常に完了した場合にのみ実行する必要がある特定のクリーンアップもあります。私は、トラップブロックテストを変数にすることでこれを引き起こすことができると考えました。

#!/bin/bash 
done=false; 
trap "{   
      #generic cleanup code goes here. 
      if $done 
      then 
       #cleanup to be done only on completion goes here. 
       echo Test; 
      fi 
     }" EXIT 
#main script goes here 
done=true; 

しかし、これは機能しません。次のコードを実行すると、 "Test"がエコーされません。 done=true;の後に明示的なexitコールを追加しても、何も変更されません。私は何が欠けていますか?

乾杯!

答えて

13

トラップは補間されており、トラップが実行されているときではなく定義されているときに$ doneの値を使用しています。トラップ定義の周りに単一引用符を使用するか、関数を定義することができます。機能を定義することは、おそらくクリーナーです:

 
#!/bin/sh 
done=false 
cleanup() { if $done; then echo Test; fi; } 
trap cleanup EXIT 
done=true 

関数が呼び出されるまで、関数内の変数の展開はかなり機能が定義されているときよりも、延期されたので、これは動作します。

関連する問題