web-dev-qa-db-ja.com

Bash:トラップを2回発行する

trapビルトインを[同じシグナルに対して] 2回発行するとどうなりますか? 2番目のコマンド追加は最初のコマンドですか、それともreplaceは最初のコマンドですか?

trap Foo SIGINT
...
trap Bar SIGINT
...

SIGINTが発生した場合、BashはBarだけを実行しますか、それともFooも実行しますか?または、他の何か...?

7

コマンドが置き換えられます。

マンページは次のように述べています:

 trap [-lp] [[arg] sigspec ...]
        The  command  arg  is  to  be  read  and executed when the Shell
        receives signal(s) sigspec.  If arg is absent (and  there  is  a
        single  sigspec)  or  -,  each  specified signal is reset to its
        original disposition (the value it  had  upon  entrance  to  the
        Shell).   If arg is the null string the signal specified by each
        sigspec is ignored by the Shell and by the commands it  invokes.
        If  arg  is  not present and -p has been supplied, then the trap
        commands associated with each  sigspec  are  displayed.   If  no
        arguments  are  supplied or if only -p is given, trap prints the
        list of commands associated with each  signal.   The  -l  option
        causes  the Shell to print a list of signal names and their cor‐
        responding numbers.   Each  sigspec  is  either  a  signal  name
        defined  in  <signal.h>,  or  a signal number.  Signal names are
        case insensitive and the SIG prefix is optional.

the command arg is to be read and executed ... 限目。そうでなければ、argが常にリストに追加されていると、信号処理をリセットできません。

6
wurtel

manual から:

trap [-lp] [arg] [sigspec …]

argのコマンドは、シェルが信号sigspecを受け取ったときに読み取られて実行されます。

説明には、既存のコマンドリストへの追加については何も書かれていません。 argが空の場合、または文字列-の場合、非インクリメンタル効果を指定します。テキストは、コマンドがリストに追加されていないことを明示的に述べていない場合がありますが、そのようなリストや、リストから項目を削除する手段については言及していません。したがって、連続するtrapコマンドがargをリストに追加することを意味するような方法でこのテキストを解釈することは、かなり遠く離れています。

別のシェルのマニュアルを確認することで確認できます。 bashが通常の振る舞いから逸脱した場合、マニュアルは明らかにそのように述べています。 POSIX標準 は問題に関して明確です:

trapのアクションは、以前のアクション(デフォルトのアクションまたは明示的に設定されたアクション)をオーバーライドします。

問題についてdocumentationはまだ見つかりませんが、テストからappearsは、2番目のtrap仕様が最初の仕様を完全に置き換えていることを示しています。 (つまり、Barは実行されますが、Fooは実行されません。)

1