Bash

我可以確定目前函式是否已通過命令替換被呼叫?

  • June 24, 2020
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變數從零遞增。

引用自:https://unix.stackexchange.com/questions/594806