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 ~]$
ドキュメントを確認しましたが、どこにも違いが解明されていません。私doは、単一のハイフン形式が POSIXで指定されている であることを確認します。
--
がsh
で機能しないこと以外に、トラップの設定を解除する2つの方法の動作に違いはありますか?
これについては、trap(1P) man page および Advanced Bash Scripting Guide で詳しく説明しています。これは、--
がBashの組み込みであることを説明しています、コマンドの「オプションの終わり」を示すために使用されます。 sh
を使用するスクリプトは、他のシステム間で移植できるように設計されているため、bashは--posix
で実行されたかのように動作し、POSIX仕様に一致するようにシェルの動作を変更します。
シグナルが「トラップ」されると(例:EXIT
)、コマンドの後の最初の引数をシグナルにバインドし、シグナルが発行されたときにeval
- ingし、その通常を無視します動作(EXIT
を除く)。したがって、trap 'echo something' EXIT
を実行してからexit
を実行すると、シェルは終了する前にeval 'echo something'
を実行します。これは、TERM
などの別のシグナルでも機能します。これは、スクリプト内の適切な終了関数などにバインドできます。 trap -- EXIT
が実行されると、--
は「引数の終わり」として解釈され、信号がnullにバインドされることをtrap
に示す(''
)( --
)の前後にフラグがないため、シェルにシグナルを無視するように指示します(ただし、これはEXITでは機能しませんが、他のシグナルでは機能します)。ただし、trap -- 'echo something' EXIT
を実行しても、eval 'echo something'
は実行され、exit
で終了します。 trap
の仕様に従って、コマンド-
自体は、シェルが指定された信号のトラップをリセットすることを示しているため、sh
とBashの両方で機能します。