标准子Shell与命令替换子Shell


8

请解释以下陷阱输出:

$ line(){ echo -------------; echo $BASHPID; }
$ trap 'echo bye' EXIT; trap -p; line; (trap -p; line); echo "$(trap -p; line)"

trap -- 'echo bye' EXIT
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
-------------
6176
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
-------------
6178
trap -- 'echo bye' EXIT
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
-------------
6180

为什么Command-Substitution子Shell行为不同,因为它声称已继承了陷阱的配置(除了它实际上并没有遵循它们)?

Answers:


2

有趣。这似乎是Bash特定的行为。

我尝试了3个其他POSIX兼容的外壳程序(zsh,破折号,busybox),并且在所有这些外壳程序中都echo "$(trap)"得到了与以下结果相同的结果(trap):运行了一个子外壳程序,并且该子外壳程序未显示EXIT陷阱。

(请注意,这trap -p是特定于Bash的,没有额外的参数,它trap与没有参数的功能相同。)

Bash的行为可能有用:它意味着您可以编写a="$(trap)"捕获父Shell的陷阱设置,这很有可能会引起兴趣。

但是,如果您设置或子shell清除陷阱,然后它列出子shell的陷阱,而不是父母的:

$ trap 'echo bye' EXIT
$ echo "$(trap TERM; trap)"  # explicitly clear TERM, but leave EXIT alone
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU

因此,它们还介绍了您对Subshel​​l陷阱感兴趣的罕见情况。

总的来说,我注意到Bash开发人员似乎已经付出了一些额外的努力来使subshel​​l处理正常工作。使用Bash管理后台子进程也比使用最小的POSIX shell容易得多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.