所有的 shell 选项都不是由脚本继承的吗?

所有的 shell 选项都不是由脚本继承的吗?

如果我运行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)时,它特别适合调试选项。如果你shbash,这也会影响他们,system("command line")其他语言的制作也会受到影响:

env SHELLOPTS=xtrace some-command

答案2

您可以使用选项显式调用脚本(或带有命令行的 shell):

shopt -s expand_aliases
alias shell_call='bash -$-'
shell_call /path/to/script

对脚本的更改将自动传递到子 shell。不过,这种方法只能打开功能。

相关内容