如何让 Bash 子 shell 继承父 shell 的设置选项?

35
假设我在脚本“a.sh”中使用了set -x命令,并调用了另一个脚本“b.sh”。
是否有可能让“b.sh”继承自“a.sh”的-x选项?

4
使用 .source 命令来调用 b.sh 脚本。 - devnull
4个回答

41
export SHELLOPTS
例如:
echo date > b
chmod +x b

如果没有导出,当./a调用./b时,我们只会看到./a中的命令:

$ echo ./b > a
$ bash -xv a

./a
+ ./b
Sun Dec 29 21:34:14 EST 2013

但是,如果我们导出SHELLOPTS,我们就能看到./a./b中的命令。

$ echo "export SHELLOPTS; ./b" > a
$ bash -xv a

./a
+ ./b  date
++ date   
Sun Dec 29 21:34:36 EST 2013

1
这对我来说有点太复杂了。 - Marcos Pereira

4

由于-x不被子shell继承,因此您需要更加明确。您可以使用$-特殊参数来测试何时使用-x

if [[ $- = *x* ]]; then
    # Set the option, then *source* the script, in a subshell
    ( set -x; . b.sh )
else
    # Simply run the script; subshell automatically created.
    ./b.sh
fi

0

如果脚本b引用脚本a,它们将被合并到脚本b中。这可能会或可能不会解决你的问题!


谢谢你的回答,但是这样b就不会成为一个子shell了。你知道一种在执行时将其作为命令而不是作为源代码的方法吗? - dspjm
@dspjm 这不可能发生在子shell中。 - devnull

0

就像@devnull说的那样,你可以在你的脚本中使用.操作符。

在a.sh中

. SETVALUES

在b.sh中

. SETVALUES

在SETVALUES中

set -x

无论你在哪里调用SETVALUES,这些值都会在子shell中设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接