’trap -- EXIT’和’trap - EXIT’之間的區別
我注意到,當 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 將為指定的信號重置任何陷阱,這就是它在sh
Bash 和 Bash 中工作的原因。