脚本是否在命令替换中运行?

脚本是否在命令替换中运行?

在 POSIX 兼容的 shell 中,是否可以确定脚本是否在命令替换中运行?

my-outer $(my-inner)  $(my-other-inner)

对于上面的例子,my-inner需要my-other-inner判断是否是内部命令替换。

答案1

如果我理解得好的话,其实不然。

您的问题归结为:我是foobar从“主”shell 运行还是echo $(foobar)(命令替换)运行?

foobar可以测试以下内容

  • tty(我在 tty 下吗?)
  • $SHLVL(有多少叠贝壳?)

根据您的需要,您可以存储并比较SHLVLvar,这假​​设您(您的 shell)是运行该命令的人。

我把引号放在 main 周围,因为没有主 shell 这样的东西,你有登录 shell(带有 tty),从 cron 分叉的 shell,守护进程(邮件,apache),但没有“主”shell。

编辑:

正如所指出的,SLVL 使用起来可能很棘手

archemar@home> cat t2.sh
echo "$SHLVL" $1
archemar@home> . ./t2.sh $SHLVL
3 3
archemar@home> ./t2.sh $SHLVL
4 3
archemar@home> ./t2.sh $(./t2.sh)
4 4
archemar@home>

答案2

zsh,检查cmdsubst字符串是否存在于其中zsh_eval_context大批:

$ echo "$(
  c=cmdsubst
  if (($zsh_eval_context[(Ie)$c])); then
    echo inside cmdsubst
  fi
)"
inside cmdsubst

相关内容