如果我运行set -x
然后在 shell 中运行脚本,则设置的选项set -x
在脚本内不起作用。
我想知道所有 shell 选项是否都不是由脚本继承的?
我没有发现bash手册中提到这一点。我发现的唯一相关的是“除非另有说明,这些值是从 shell 继承的。”所以我猜 shell 选项是继承的。我错过了手册中的内容吗?
我读过了一个相关的问题其中询问如何让脚本继承 shell 选项。我想知道是否以及为什么而不是如何。
谢谢。
当要执行除内置函数或 shell 函数之外的简单命令时,将在由以下内容组成的单独执行环境中调用它。除非另有说明,这些值都是从 shell 继承的。
• shell 的打开文件,以及通过重定向到命令指定的任何修改和添加
• 当前工作目录
• 文件创建模式掩码
• 标记为导出的 shell 变量和函数,以及为命令导出的变量,在环境中传递(请参见第 3.7.4 节 [环境],第 37 页)
• 由 shell 捕获的陷阱将重置为从 shell 的父级继承的值,并且由 shell 忽略的陷阱将被忽略。在此单独环境中调用的命令不能影响 shell 的执行环境。
答案1
在 的情况下bash
,这取决于是否$SHELLOPTS
在环境中。
bash-4.4$ export SHELLOPTS
bash-4.4$ set -x
bash-4.4$ bash -c 'echo x'
+ bash -c 'echo x'
+ echo x
x
看看如何bash -c 'echo x'
继承该xtrace
选项。对于 所设置的选项shopt
,与 相同,但带有$BASHOPTS
变量。
xtrace
当您想要运行bash
脚本(或运行脚本的任何命令bash
)以及bash
它可能递归调用的所有其他脚本xtrace
(假设这些脚本中不执行任何操作set +x
)时,它特别适合调试选项。如果你sh
是bash
,这也会影响他们,system("command line")
其他语言的制作也会受到影响:
env SHELLOPTS=xtrace some-command
答案2
您可以使用选项显式调用脚本(或带有命令行的 shell):
shopt -s expand_aliases
alias shell_call='bash -$-'
shell_call /path/to/script
对脚本的更改将自动传递到子 shell。不过,这种方法只能打开功能。