2017-01-12 31 views
7

的退出代碼這是myscript.sh擊:陷阱

#!/bin/bash 

function mytrap { 
    echo "Trapped!" 
} 
trap mytrap EXIT 

exit 3 

當我運行它:

> ./myscript.sh 
echo $? 
3 

爲什麼是腳本的退出代碼的陷阱一樣的退出代碼沒有它?通常,函數隱式返回最後執行的命令的退出代碼。在這種情況下:

  1. 回聲返回0
  2. 我希望mytrap返回0
  3. 由於mytrap是最後執行的功能,腳本應該返回0

這是爲什麼不案件?我的思想在哪裏錯了?

+1

人提示:這是一個好主意,始終使用'設置-e'並在「設置-o pipefail」你bash腳本。一旦一個命令失敗,這將立即停止腳本。它可以讓你在半焙烤狀態下做愚蠢的事情之前發現錯誤並中止。 –

回答

6

從下面man bash頁看基準,

出口[n]的 導致shell與n的狀態退出。如果省略n,則退出狀態是最後執行的命令的狀態。執行陷阱執行之前 shell終止。

你必須在腳本的調試版本證明,

+ trap mytrap EXIT 
+ exit 3 
+ mytrap 
+ echo 'Trapped!' 
Trapped! 

考慮一樣的,你在你的評論中提到,該trap函數返回一個錯誤代碼,

function mytrap { 
    echo "Trapped!" 
    exit 1 
} 

看看腳本的擴展版本,

+ trap mytrap EXIT 
+ exit 3 
+ mytrap 
+ echo 'Trapped!' 
Trapped! 
+ exit 1 

echo $? 
1 

爲了捕捉退出代碼上trap功能,

function mytrap { 
    echo "$?" 
    echo "Trapped!" 
} 
+0

所以有退出後執行的命令?我可以運行另一個出口嗎?然後腳本的退出代碼是什麼?這會導致無限的陷阱循環嗎? – dangonfast

+2

如果您在陷阱代碼中放置了「退出1」,那將是腳本的退出代碼。 – codeforester

+0

@delavnog:引用codeforester的點 – Inian