我可以通过命令替换来确定当前函数是否被调用吗?

我可以通过命令替换来确定当前函数是否被调用吗?
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 函数是通过命令替换调用的

有什么办法可以做到这一点吗?

答案1

我相信您可以使用的一项测试是

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 是命令替换还是其他子 shell。

你也可以使用

if [[ $BASH_SUBSHELL -eq 0 ]]; then
    echo was called directly
else
    echo was called in a subshell
fi

以获得与所示代码相同的效果。

对于嵌套子 shell 的每个附加层,该BASH_SUBSHELL变量从零开始递增。

相关内容