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
变量从零开始递增。