簡體   English   中英

如何在 Bash 腳本中捕獲退出代碼

[英]How to trap exit code in Bash script

我的 bash 代碼中有很多退出點。 我需要在退出時做一些清理工作,所以我使用陷阱為退出添加回調,如下所示:

trap "mycleanup" EXIT

問題是退出代碼不同,我需要做相應的清理工作。 我可以在 mycleanup 中獲得退出代碼嗎?

接受的答案基本上是正確的,我只是想澄清一下。

以下示例運行良好:

#!/bin/bash

cleanup() {
    rv=$?
    rm -rf "$tmpdir"
    exit $rv
}

tmpdir="$(mktemp)"
trap "cleanup" EXIT
# Do things...

但是,如果在沒有函數的情況下進行內聯清理,則必須更加小心。 例如,這將不起作用:

trap "rv=$?; rm -rf $tmpdir; exit $rv" EXIT

相反,您必須逃避$rv$? 變量:

trap "rv=\$?; rm -rf $tmpdir; exit \$rv" EXIT

您可能還想轉義$tmpdir ,因為它將在執行陷阱行時進行評估,並且如果tmpdir值稍后更改,則可能不會給出預期的行為。

編輯:使用shellcheck檢查您的 bash 腳本並注意此類問題。

我認為您可以使用$? 獲取退出代碼。

我發現最好將 EXIT 陷阱與其他信號的陷阱分開

示例陷阱測試腳本...

umask 77
tmpfile=`tmpfile.$$`
trap 'rm -f "$tmpfile"' EXIT
trap 'exit 2' HUP INT QUIT TERM

touch $tmpfile
read -r input 

exit 10

臨時文件被清理。 文件退出值 10 被保留! 中斷導致退出值為 2

基本上只要您不在 EXIT 陷阱中使用“exit”,它就會在保留原始退出值的情況下退出。

旁白:注意 EXIT 陷阱中的引用。 這讓我可以更改腳本生命周期內需要清理的文件。 在嘗試刪除 $tmpfile 之前,我還經常測試它是否存在,因此我什至不需要在腳本的開頭設置它,只需要在創建它之前。

以下代碼運行良好。 您可以存儲退出代碼並在陷阱函數中定義每個退出代碼所需的命令。

#!/bin/bash
trap cleanup EXIT
cleanup() {
   exit_code=$?
   if [[ ${exit_code} -eq 1 ]]; then
       # command 1
   elif [[ ${exit_code} -eq 2 ]]; then
       # command 2
   elif [[ ${exit_code} -eq 3 ]]; then
       # command 3
   fi
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM