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

Too*_*ets 4 bash command-substitution subshell

foo() {
  if [[ something ]]; then
    echo "The foo function was called directly."
  else
    echo "The foo function was invoked via command substitution."
  fi
}
Run Code Online (Sandbox Code Playgroud)

直接调用 foo:

foo

foo 函数被直接调用。

通过命令替换调用 foo:

a=$(foo) || exit 1
echo "${a}"
Run Code Online (Sandbox Code Playgroud)

foo 函数是通过命令替换调用的

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

Kus*_*nda 7

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

if [[ $BASHPID -eq $$ ]]; then
    echo was called directly
else
    echo was called in a subshell
fi
Run Code Online (Sandbox Code Playgroud)

特殊值$$将是执行脚本的 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
Run Code Online (Sandbox Code Playgroud)

在显示的代码中具有相同的效果。

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