web-dev-qa-db-ja.com

「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 ~]$ 

ドキュメントを確認しましたが、どこにも違いが解明されていません。私doは、単一のハイフン形式が POSIXで指定されている であることを確認します。

--shで機能しないこと以外に、トラップの設定を解除する2つの方法の動作に違いはありますか?

4
Wildcard

これについては、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の両方で機能します。

7