确定这种行为是否符合预期的唯一方法是询问 Chet Ramey(GNU bash 维护者)。请将您的报告发送电子邮件至 bug-bash@gnu.org
您可以看到当前的行为似乎是正确的,因为它在以下位置明确处理子外壳情况:http: //git.savannah.gnu.org/cgit/bash.git/tree/execute_cmd.c#n621
/* We want to run the exit trap for forced {} subshells, and we
want to note this before execute_in_subshell modifies the
COMMAND struct. Need to keep in mind that execute_in_subshell
runs the exit trap for () subshells itself. */
/* This handles { command; } & */
s = user_subshell == 0 && command->type == cm_group && pipe_in == NO_PIPE && pipe_out == NO_PIPE && asynchronous;
/* run exit trap for : | { ...; } and { ...; } | : */
/* run exit trap for : | ( ...; ) and ( ...; ) | : */
s += user_subshell == 0 && command->type == cm_group && (pipe_in != NO_PIPE || pipe_out != NO_PIPE) && asynchronous == 0;
last_command_exit_value = execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close);
if (s)
subshell_exit (last_command_exit_value);
else
sh_exit (last_command_exit_value);
如您所见,显式子shell 情况作为一种特殊情况处理(命令分组也是如此)。正如 Adrian 发现的那样,由于多个错误报告,这种行为在历史上已经演变。
这是此特定功能的更改列表(在子外壳上触发 EXIT 陷阱):
提交:http ://git.savannah.gnu.org/cgit/bash.git/commit/?id=a37d979e7b706ce9babf1306c6b370c327038eb9
+execute_cmd.c
+ - execute_command_internal: make sure to run the EXIT trap for group
+ commands anywhere in pipelines, not just at the end. From a point
+ raised by Andreas Schwab <schwab@linux-m68k.org>
报告:https ://lists.gnu.org/archive/html/bug-bash/2013-04/msg00126.html (回复:在等待期间未触发管道子外壳中的陷阱退出)
提交:http ://git.savannah.gnu.org/cgit/bash.git/commit/?id=1a81420a36fafc5217e770e042fd39a1353a41f9
+execute_cmd.c
+ - execute_command_internal: make sure any subshell forked to run a
+ group command or user subshell at the end of a pipeline runs any
+ EXIT trap it sets. Fixes debian bash bug 698411
+ http://bugs.debian.org/cgi-big/bugreport.cgi?bug=698411
报告:https ://bugs.debian.org/cgi-bin/bugreport.cgi?bug=698411 (EXIT 陷阱和管道和子shell)
提交:http ://git.savannah.gnu.org/cgit/bash.git/commit/?id=fd58d46e0d058aa983eea532bfd7d4c597adef54
+execute_cmd.c
+ - execute_command_internal: make sure to call subshell_exit for
+ {} group commands executed asynchronously (&). Part of fix for
+ EXIT trap bug reported by Maarten Billemont <lhunath@lyndir.com>
报告: http: //lists.gnu.org/archive/html/bug-bash/2012-07/msg00084.html(交互式shell中的EXIT陷阱)
最近还有一个关于 EXIT 陷阱未在某些预期上下文中执行的错误报告:http: //lists.gnu.org/archive/html/bug-bash/2016-11/msg00054.html