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 函数是通过命令替换调用的
有什么办法可以做到这一点吗?
我相信您可以使用的一项测试是
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对于嵌套子壳的每个附加级别,该变量从零开始递增。
| 归档时间: |
|
| 查看次数: |
57 次 |
| 最近记录: |