在 bash 中捕获 SIGINT 时,-- 在 trap 命令中有什么影响?

When trapping SIGINT in bash what effect does the -- have in the trap command?

我一直在阅读 bash 中关于处理 SIGINT 的各种帖子,但我仍然没有正确理解它。

我知道 trap '_handler_name' SIGINT 在收到信号时运行 _handler_name。 (人们似乎总是把它放在单引号中,但我不知道为什么。对我来说似乎没有必要。)

我希望能够捕获 SIGINT 并在不中止脚本中的循环的情况下处理它,但这似乎只有在循环位于其自己的子 shell 中时才有效。 (我不知道为什么会这样...)

我原以为使用 trap -- '_handler_name' SIGINT 可能会以某种方式阻止脚本的其他部分在收到信号时中止。 (这是基于我对 this answer 的阅读。)

所以我的主要问题是:--trap 有什么影响。我以为那总是意味着“那是开关的末端”,但我看到的例子在那之后没有 -,所以它看起来是多余的。

有助于我理解的子问题是:trap 对子 shell 有什么影响?为什么人们在 trap 命令中将处理程序名称放在引号中?

对于上下文,我正在尝试做的是发现一个 SIGINT,礼貌地终止几个进程,然后等待几秒钟让一切完成,然后再手动退出。

PS This article 很有趣,虽然我没有设法从阅读中得到我的解决方案。


更新: 我已经将这里的内容移到 ,因为事实证明我在这里问的不是我观察到的问题。

what effect does the -- have on trap

是的,它 just means "that's the end of the switches"https://github.com/bminor/bash/blob/master/builtins/trap.def#L110 -> https://github.com/bminor/bash/blob/f3a35a2d601a55f337f8ca02a541f8c033682247/builtins/bashgetopt.c#L85

what effect does trap have on subshells?

来自bash手动命令执行环境https://www.gnu.org/software/bash/manual/bash.html#Command-Execution-Environment

When a simple command other than a builtin or shell function is to be executed, it is invoked in a separate execution environment that consists of the following. Unless otherwise noted, the values are inherited from the shell.

...

  • traps caught by the shell are reset to the values inherited from the shell’s parent, and traps ignored by the shell are ignored

...

Command substitution, commands grouped with parentheses, and asynchronous commands are invoked in a subshell environment that is a duplicate of the shell environment, except that traps caught by the shell are reset to the values that the shell inherited from its parent at invocation.

下面还有 trap 内置函数:

Trapped signals that are not being ignored are reset to their original values in a subshell or subshell environment when one is created.

另外 errexitERR 有关。

why do people put the handler name in quotes in the trap command?

化妆品。因为 trap 重新评估字符串,这是一个视觉提示,表明它是要重新评估的字符串,而不是单词列表。