“trap -⁠- EXIT”和“trap - EXIT”之间的区别

“trap -⁠- EXIT”和“trap - EXIT”之间的区别

我注意到,当 Bash 被称为 as 时sh,您不能使用例如取消设置陷阱,trap -- EXIT但是当它被称为 as 时,bash您可以。

trap - EXIT无论 shell 如何调用,似乎都可以工作。


输出示例:

[vagrant@localhost ~]$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar  9  2016 /bin/sh -> bash
[vagrant@localhost ~]$ sh
sh-4.1$ trap 'echo something' EXIT
sh-4.1$ exit
exit
something
[vagrant@localhost ~]$ sh
sh-4.1$ trap 'echo something' EXIT
sh-4.1$ trap -- EXIT
trap: usage: trap [-lp] [[arg] signal_spec ...]
sh-4.1$ trap - EXIT
sh-4.1$ exit
exit
[vagrant@localhost ~]$ bash
[vagrant@localhost ~]$ trap 'echo something' EXIT
[vagrant@localhost ~]$ exit
exit
something
[vagrant@localhost ~]$ bash
[vagrant@localhost ~]$ trap 'echo something' EXIT
[vagrant@localhost ~]$ trap -- EXIT
[vagrant@localhost ~]$ exit
exit
[vagrant@localhost ~]$ bash
[vagrant@localhost ~]$ trap 'echo something' EXIT
[vagrant@localhost ~]$ trap - EXIT
[vagrant@localhost ~]$ exit
exit
[vagrant@localhost ~]$ 

我检查了文档,但没有看到任何地方阐明了差异。我看到单个连字符形式是由 POSIX 指定

--除了不工作之外,两种解除陷阱的方法之间的行为有什么区别吗sh

答案1

这在陷阱中有一些解释(1P)手册页以及更多内容高级 Bash 脚本编写指南,这解释了 是--Bash 内置的,用于表示命令的“选项结束”。由于脚本 usingsh被设计为可在其他系统之间移植,因此 bash 的行为就像使用 执行一样--posix,这会更改一些 shell 行为以匹配 POSIX 规范。

当信号被“捕获”时(例如EXIT),它将命令后的第一个参数绑定到信号,eval在发出信号时对其进行 -ing,并忽略其正常行为(除了EXIT)。因此,当trap 'echo something' EXIT运行时,然后exit,外壳将eval 'echo something'在退出之前。这也适用于不同的信号,例如TERM,它可以绑定到脚本中的优雅退出函数等。当trap -- EXIT运行时, 被--解释为“参数结束”,指示trap该信号将绑定到 null ( '') (因为在 之前或之后没有标志--),指示 shell 忽略该信号(但是,这不适用于 EXIT,但适用于其他信号)。然而,运行trap -- 'echo something' EXIT仍将eval 'echo something'在 时停止并退出exit。根据 的规范trap,该命令-本身表明 shell 将重置指定信号的任何陷阱,这就是它在shBash 和 Bash 中都有效的原因。

相关内容