Bashがとして呼び出されると、sh
トラップの設定を解除するために使用することはできませんが、として呼び出されると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で指定。
--
動作しないことに加えて、トラップを解除する2つの方法の間に動作に違いがありますかsh
?
答え1
トラップ(1P)にこれについての説明があります。マニュアルページそしてもっと高度なバッシュスクリプトガイド、--
コマンドの「オプションの終わり」を示すために使用される組み込み Bash を記述します。 usingスクリプトは異なるシステム間で移植可能に設計されているため、bashはPOSIX仕様と一致するようにいくつかのシェルの動作を変更することで実行されたかのようにsh
動作します。--posix
シグナルが「キャッチされている場合」(例EXIT
:)コマンドの後の最初の引数をシグナルにバインドし、eval
シグナルが発生したときにそれを-ingし、通常の動作を無視します(除外EXIT
)。したがってtrap 'echo something' EXIT
、実行すると、exit
シェルがeval 'echo something'
終了する前に終了します。これは他の信号でも機能します。たとえば、TERM
スクリプトなどのエレガントなシャットダウン機能にバインドできます。trap -- EXIT
実行時に--
「引数の終わり」と解釈trap
され、シグナルがnull()にバインドされることを示し''
(前後にフラグがないため--
)、シェルにシグナルを無視するように指示します(ただし、EXITには適用されません)。 、しかし他の人にはSignal)。ただし、実行はtrap -- 'echo something' EXIT
まだeval 'echo something'
中止され終了しますexit
。仕様によれば、trap
コマンド-
自体は、シェルが指定された信号のトラップをリセットすることを示すので、sh
BashとBashの両方で動作します。