2012-02-10 12 views
6

我有一堆通用清理代碼,需要在某個bash腳本退出時執行,無論它是正常退出還是中斷。我想我會用trap "..." EXIT pseudosignal來達到這個目的。在聲明「陷阱」塊後,Bash信號捕獲未檢測到變量

除了通用清理的東西,還有一個特定的清理應該只在腳本正常完成時完成。我想我可以通過讓'陷阱'塊測試一個變量來觸發這種情況,如下所示:

#!/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; 

但是,這是行不通的。運行以下代碼將永遠不會回顯「測試」。在done=true;之後添加明確的exit調用不會更改任何內容。我錯過了什麼?

乾杯!

回答

13

陷阱正在進行插值,並且正在使用陷阱定義時的$ done值而不是執行陷阱時的值。您可以在陷阱定義周圍使用單引號,或者定義一個函數。定義一個函數可能是清潔劑:

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

這工作,因爲變量在功能擴展將被推遲到函數被調用,而不是被定義的功能時。