![“trap -- EXIT”和“trap - EXIT”之间的区别](https://linux22.com/image/102577/%E2%80%9Ctrap%20-%E2%81%A0-%20EXIT%E2%80%9D%E5%92%8C%E2%80%9Ctrap%20-%20EXIT%E2%80%9D%E4%B9%8B%E9%97%B4%E7%9A%84%E5%8C%BA%E5%88%AB.png)
我注意到,当 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 将重置指定信号的任何陷阱,这就是它在sh
Bash 和 Bash 中都有效的原因。