trap命令用於捕獲指定的信號並執行預定義的命令,為shell內置命令
有兩個常用選項
基本語法:
trap 'command' signal
signal是要捕獲的信號,command是捕獲到信號后,將要執行的命令,命令可以是若干條shell語句,也可以是一個函數
shell腳本在執行時,會產生三個"偽信號"(由shell產生,與os無關),trap也可捕獲這三個"偽信號"
shell "偽信號"
- 信號名 產生時間
- EXIT 從一個函數中退出或整個腳本執行完畢
- ERR 當一條命令返回非0狀態
- DEBUG 腳本中每條命令執行之前
- EXIT
通過捕獲EXIT信號,可以在shell腳本中止執行或從函數中退出時,輸出某些想要跟蹤變量的值
trap 'COMMAND' EXIT
1 #!/bin/env sh 2 3 function exittrap(){ 4 echo "[LINE:$1] Error: Command or Function exited with status $?" 5 } 6 #trap 'errtrap $LINENO' EXIT 7 trap "errtrap $LINENO" EXIT 8 9 function vbn(){ 10 echo 'vbn' 11 } 12 13 vbn
需要對trap后的command加''進行保護,否則LINENO在第六行就會被替換,輸出的行號LINENO==1,是因為進到函數vbn執行的時候打開了子shell,LINENO是按照子shell來計數,執行完echo命令后,立即調用了全局errtrap函數(此時,仍在子shell中)
下面為使用""的情況 - ERR
通過捕獲ERR信號,我們可以追蹤執行不成功的命令或函數
#!/bin/evn sh function errtrap() { echo "[LINE:$1] Error: Command or function exited with status $?" } function foo() { return 0; } function bar() { return 1; } trap 'errtrap $LINENO' ERR zxc foo bar
- DEBUG
通過捕獲DEBUG信號,我們只需要一條trap語句就可以完成相關變量的全程跟蹤
#!/bin/env sh trap 'echo "before execute line:$LINENO,a=$a,b=$b,c=$c" ' DEBUG a=1 if [[ $a -eq 1 ]] then b=2 else b=1 fi c=3 echo '############################'