Wil*_*ard 4 shell bash exit trap
我注意到当 Bash 被调用为 as 时sh
,你不能使用 eg, 取消设置陷阱trap -- EXIT
,但是当它被调用时bash
你可以。
trap - EXIT
无论外壳如何调用,似乎都可以工作。
示例输出:
[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 ~]$
Run Code Online (Sandbox Code Playgroud)
我检查了文档,但我没有看到任何地方阐明的差异。我确实看到单个连字符形式是由 POSIX 指定的。
有没有在你重置陷阱的两种方法之间的行为有什么区别,比其他--
在不工作sh
?
小智 8
这在 trap(1P)手册页中有一些解释,在Advanced Bash Scripting Guide中有更多解释,其中解释了--
是 Bash 内置的,用于表示命令的“选项结束”。由于脚本 usingsh
旨在通过它在其他系统之间移植,因此 bash 的行为就好像它是用 执行的--posix
,这会更改某些 shell 行为以匹配 POSIX 规范。
当信号被“捕获”时,(例如,EXIT
),它将命令后的第一个参数绑定到信号,eval
在发出信号时将其 -ing,并忽略其正常行为(除了EXIT
)。因此,当trap 'echo something' EXIT
运行时,exit
shell 将eval 'echo something'
在退出之前。这也适用于不同的信号,例如TERM
,它可以绑定到,例如,脚本中的优雅退出函数。当trap -- EXIT
运行时,--
被解释为一个“的参数结束”,表示trap
该信号是要被绑定到空(''
)(因为有之前或之后没有任何标志--
),指示对壳忽略信号(但是,这不适用于 EXIT,但适用于其他信号)。跑步trap -- 'echo something' EXIT
,然而,将仍然eval 'echo something'
并退出exit
。根据 的规范trap
,该命令-
本身表明 shell 将为指定的信号重置任何陷阱,这就是它在sh
Bash 和 Bash中都能工作的原因。