2014-09-04 95 views
0

說我有兩個腳本,只是從沒用標打印回返回代碼:BASH:如何判斷腳本是否使用退出?

SCRIPT1

(echo; exit 0) 
echo $? 

SCRIPT2

(echo) 
echo $? 

兩個回饋0。但是有沒有辦法告訴第一個下標明確使用exit命令?

+2

不是我所知道的。你爲什麼想這樣做? – 2014-09-04 18:01:56

+0

只需以不同於0的值退出以指示退出。 – choroba 2014-09-04 18:02:57

+0

@EtanReisner假設我正在製作其他腳本的包裝。 – Pithikos 2014-09-04 18:04:43

回答

1

經過一番研究,我獲得了一些突破。也就是說,您可以設置一個exit_handler,通過簡單地檢查最後一條命令來確定是否有退出呼叫。

#! /bin/bash 

exit_handler() { 
    ret=$? 
    if echo "$BASH_COMMAND" | grep -e "^exit " >> /dev/null 
    then 
     echo "it was an explicit exit" 
    else 
     echo "it was an implicit exit" 
    fi 
    exit $ret 
} 
trap "exit_handler" EXIT 

exit 22 

這將打印

it was an explicit exit 

現在爲了告訴父母,而不是呼應,我們可以相當寫入到文件,命名管道或別的什麼東西。


作爲每choroba,exit的注意到沒有參數會給implicit call,這是公認的錯誤的,因爲exit(無參數)是一樣的exit $?。因此,正則表達式必須考慮到這一點:

#! /bin/bash 

exit_handler() { 
    ret=$? 
    if echo "$BASH_COMMAND" | grep -e "^exit \|^exit$" >> /dev/null 
    then 
     echo "it was an explicit exit" 
    else 
     echo "it was an implicit exit" 
    fi 
    exit $ret 
} 
trap "exit_handler" EXIT 

exit 22 
+0

您正在每個'script1'和'script2'中實現'exit_handler()'。如果'script2'中的最後一個命令是'echo',現在該退出「'了? – 2014-09-04 20:56:40

+0

我考慮到了這一點。它不應該與正則表達式'^ exit'一起傳遞,因爲正則表達式只允許以退出後跟一個空格開始的命令。唯一的命令是'exit' – Pithikos 2014-09-04 21:04:38

+0

看起來是一個很好的解決方案。我重新訪問了'man bash'的'Shell Variables'部分。我認爲你遇到了一個很好的解決方案。我唯一的好奇心就是'BASH_COMMAND'中描述的方式,具體來說,**它是在陷阱**時執行的命令。顯然它正在工作,但看到**這是在陷阱**之前執行的最後一個命令將是令人欣慰的。哦,我仍然喜歡它:) – 2014-09-04 21:16:39