「trap-⁠-EXIT」と「trap-EXIT」の違い

「trap-⁠-EXIT」と「trap-EXIT」の違い

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コマンド-自体は、シェルが指定された信号のトラップをリセットすることを示すので、shBashとBashの両方で動作します。

おすすめ記事