Bash

’trap -⁠- EXIT’和’trap - EXIT’之間的區別

  • January 7, 2017

我注意到,當 Bash 被稱為 時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 ~]$ 

我檢查了文件,但我沒有看到任何地方闡明的差異。我確實看到POSIX 指定了單個連字元形式。

--除了不工作之外,這兩種解除陷阱的方法在行為上是否有任何區別sh

這在 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信號將綁定到 null ( '')(因為在 之前或之後沒有標誌--),指示 shell 忽略信號(但是,這不適用於 EXIT,但適用於其他信號)。跑步trap -- 'echo something' EXIT但是,仍然會eval 'echo something'在 時退出exit。根據 的規範trap,該命令-本身表明 shell 將為指定的信號重置任何陷阱,這就是它在shBash 和 Bash 中工作的原因。

引用自:https://unix.stackexchange.com/questions/335530