![](/img/trans.png)
[英]Capturing the exit code of sourced shell script without invoking subshell
[英]Return an exit code without closing shell
我想從另一個腳本中調用的 BASH 腳本返回退出代碼,但也可以直接調用。 它大致看起來像這樣:
#!/bin/bash
dq2-get $1
if [ $? -ne 0 ]; then
echo "ERROR: ..."
# EXIT HERE
fi
# extract, do some stuff
# ...
現在在EXIT HERE
行中,腳本應該退出並返回退出代碼 1。問題是
return
,因為當我忘記 source 腳本而不是調用它時, return不會退出,並且腳本的 rest 將被執行並搞砸。exit
,因為這會關閉 shell。kill -SIGINT $$
,因為這不允許返回退出代碼。有沒有我忽略的可行替代方案?
問題標題的答案(不像其他答案那樣在正文中)是:
返回退出代碼而不關閉 shell
(exit 33)
如果您需要激活-e
並且仍然避免使用非零退出代碼退出 shell,請執行以下操作:
(exit 33) && true
true
的命令永遠不會執行,而是用於構建不會被-e
shell 標志退出的復合命令。
這將設置退出代碼而不退出 shell(也不是源腳本)。
對於更復雜的退出問題(使用特定的退出代碼),無論是執行還是獲取:
#!/bin/bash
[ "$BASH_SOURCE" == "$0" ] &&
echo "This file is meant to be sourced, not executed" &&
exit 30
return 88
如果執行,將設置退出代碼 30(帶有錯誤消息)。
如果有來源,退出代碼為 88。 將退出執行或采購而不影響調用shell 。
使用它而不是退出或返回:
[ $PS1 ] && return || exit;
無論來源與否都有效。
您可以使用x"${BASH_SOURCE[0]}" == x"$0"
來測試腳本是否被來源或調用(如果來源為假,如果被調用則為真)並相應地return
或exit
。
另一種選擇是使用 function 並將返回值放入其中,然后簡單地獲取腳本 (source processStatus.sh) 或調用腳本 (./processStatus.sh)。 例如,考慮 processStatus.sh 腳本,它需要向 stopProcess.sh 腳本返回一個值,但還需要在不使用源代碼的情況下與命令行分開調用(僅包括相關部分)例如:
check_process ()
{
if [ $1 -eq "50" ]
then
return 1
else
return 0
fi
}
和
source processStatus.sh $1
RET_VALUE=$?
if [ $RET_VALUE -ne "0" ]
then
exit 0
fi
如果在腳本開頭使用set -e
,則可以使用return
。
如果您只想檢查 function 是否沒有返回錯誤,我建議您像這樣重寫您的代碼:
#!/bin/bash
set -e # exit program if encountered errors
dq2-get ()
{
# define the function here
# ...
if [ $1 -eq 0 ]
then
return 0
else
return 255
# Note that nothing will execute from this point on,
# because `return` terminates the function.
}
# ...
# lots of code ...
# ...
# Now, the test:
# This won't exit the program.
if $(dq2-get $1); then
echo "No errors, everything's fine"
else
echo "ERROR: ..."
fi
# These commands execute anyway, no matter what
# `dq2-get $1` returns (i.e. {0..255}).
# extract, do some stuff
# ...
現在,如果 function dq2-get $1
返回錯誤,上面的代碼將不會離開程序。 但是,由於set -e
,單獨實現 function 將退出程序。 下面的代碼描述了這種情況:
# The function below will stop the program and exit
# if it returns anything other than `0`
# since `set -e` means stop if encountered any errors.
$(dq2-get $1)
# These commands execute ONLY if `dq2-get $1` returns `0`
# extract, do some stuff
# ...
感謝您提出問題,我的情況是為某些設置source
文件,但如果不滿足某些條件,則結束腳本並跳過設置操作。
我遇到了嘗試使用exit()
實際上導致我的終端關閉的問題,並發現自己在這里:D
在查看了特定解決方案的選項后,我剛剛使用了類似下面的內容,我還認為如果這種方法適用於您的情況, Deepaks 的答案值得查看。
if [ -z "$REQUIRED_VAR" ]; then
echo "please check/set \$REQUIRED_VAR ..."
echo "skipping logic"
else
echo "starting logic"
doStuff()
echo "completed logic"
fi
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.