Bash:トラップを2回発行します。

Bash:トラップを2回発行します。

[同じ信号について]組み込みコマンドを2回実行するとtrapどうなりますか? 2番目の命令ですに追加する最初はまだです。変える最初の?

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

SIGINTが発生した場合、Bashだけが実行されますか、それともBashもBar実行されますか?Fooそれとも違うのでしょうか…?

答え1

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

マンページには次のように記載されています。

 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が常にリストに追加された場合は信号処理をリセットできません。

答え2

~から手動:

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

命令を出すアルギニンシェルがシグナルを受け取ると、読み込まれ、実行されます。信号仕様

説明には、既存のコマンドのリストに追加する方法についての言及はありません。引き続き非増分効果を指定します。アルギニン空または文字列です-。テキストはコマンドがリストに追加されないことを明示的に明記していないかもしれませんが、そのようなリストやそのリストからアイテムを削除する方法は言及されていません。したがって、trapこのテキストを連続したコマンドがリストに追加されるように解釈するのはargかなり無理です。

他のシェルのドキュメントを確認して確認できます。 Bashが通常の動作から外れた場合は、マニュアルでこれを明確に説明します。これPOSIX規格この問題については明らかです。

行動以前のタスク(デフォルトタスクまたは明示的に設定されたタスク)をオーバーライドする必要があります。

答え3

まだ見つかりません。文書質問に関しては私のテストで現れる2番目のtrap仕様は最初の仕様を完全に置き換えます。 (つまり、Bar実行されますがFoo実行されません。)

答え4

すでに答えたように、トラップコマンドは既存のトラップを置き換えます。現在のバージョンと新しいバージョンの両方を実行したい場合は、少し変更してください。

function overtrap {
  trap="$1"
  sig=$(echo $2 | tr [a-z] [A-Z])
  cur="$(trap -p $sig | sed -nr "s/trap -- '(.*)' $sig\$/\1/p")"
  if test ${cur:+x}; then
    trap "{ $trap; }; $cur" $sig
  else
    trap "$trap" $sig
  fi
}

次のように電話してください。

overtrap 'echo hi' exit
overtrap 'echo ho' exit

印刷されます

ho
hi

(しかし、携帯性が良いかどうかはわかりません。)

関連情報