Bash
我可以確定目前函式是否已通過命令替換被呼叫?
foo() { if [[ something ]]; then echo "The foo function was called directly." else echo "The foo function was invoked via command substitution." fi }
直接呼叫 foo :
foo
foo 函式被直接呼叫。
通過命令替換呼叫 foo:
a=$(foo) || exit 1 echo "${a}"
foo 函式是通過命令替換呼叫的
有沒有辦法做到這一點?
我相信您可以使用的一項測試是
if [[ $BASHPID -eq $$ ]]; then echo was called directly else echo was called in a subshell fi
特殊值
$$
將是執行腳本的 shell 的程序 ID。這在子shell(其中一個命令替換是其中之一)中不會改變。特殊值
$BASHPID
將是執行目前程式碼的 shell 的程序 ID。該值將在子外殼內更改。因此,如果它們不同,則在子 shell 中呼叫該函式。據我所知,您無法知道這個子shell 是命令替換還是其他子shell。
你也可以使用
if [[ $BASH_SUBSHELL -eq 0 ]]; then echo was called directly else echo was called in a subshell fi
在顯示的程式碼中獲得相同的效果。
對於嵌套子殼的每個附加級別,該
BASH_SUBSHELL
變數從零遞增。