在 POSIX 兼容的 shell 中,是否可以确定脚本是否在命令替换中运行?
my-outer $(my-inner) $(my-other-inner)
对于上面的例子,my-inner
需要my-other-inner
判断是否是内部命令替换。
答案1
如果我理解得好的话,其实不然。
您的问题归结为:我是foobar
从“主”shell 运行还是echo $(foobar)
(命令替换)运行?
foobar
可以测试以下内容
tty
(我在 tty 下吗?)$SHLVL
(有多少叠贝壳?)
根据您的需要,您可以存储并比较SHLVL
var,这假设您(您的 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