書式
trap [OPTIONS] [[ARG] SIGSPEC ... ]

概要

trap コマンドは
fishの イベント受信フレームワーク
ラッパーです。

POSIXシェルに対する
後方互換性のために
存在しています。

そうでなければ、
functionでイベントハンドラーを定義
してください。

以下のパラメータがあります。

ARG
シグナルを受信したときに実行されるコマンド
SIGSPEC
シグナル名
-l / --list-signals
シグナル名一覧を表示する
-p / --print
定義済の全シグナルハンドラを表示する

 

  • ARGSIGSPEC が両方指定されたとき

    • ARG はシグナル SIGSPEC を受信したときに実行されるコマンド
    • ARG が空文字のとき、

    SIGSPEC で指定された各シグナルに対して何も反応しなくなる

  • ARG を指定しない場合(SIGSPEC のみ)または - であるとき
    • 指定された各シグナルは元の振る舞いに戻る
    • シェル起動時点での設定
    • たとえば SIGUSR1 / SIGUSR2 は終了するなど
  • -p が指定されたとき
    • trap によって各シグナルハンドラが表示される

シグナル名は
大文字小文字を区別しません。

SIGプレフィクスは省略可能です。

終了ステータス

  • SIGSPEC が不正であるときに1
  • そうでないときに0

となります。

実行例

シェルに SIGUSR1
送信されたときは毎回
スタックトレース を表示します。

$ trap 'status --print-stack-trace' SIGUSR1

実行例(詳細追加)

SIGUSR1SIGUSR2
シグナルハンドラを追加します。

最初は
何のシグナルハンドラも
定義されていないので、
trap は何も表示しません。

trap コマンドは
function コマンドのラッパーなので、
シグナルハンドラは
関数定義の形で表示されます。

$ trap
$ trap 'echo AHHHHHHHH!!!' USR1 USR2
$ trap
function __trap_handler_USR1 --on-signal SIGUSR1
        echo AHHHHHHHH!!!;
end
function __trap_handler_USR2 --on-signal SIGUSR2
        echo AHHHHHHHH!!!;
end

trap -ptrap は同じです。

$ trap -p
function __trap_handler_USR1 --on-signal SIGUSR1
        echo AHHHHHHHH!!!;
end
function __trap_handler_USR2 --on-signal SIGUSR2
        echo AHHHHHHHH!!!;
end

SIGUSR1 のみの
シグナルハンドラを表示します。

$ trap -p USR1
function __trap_handler_USR1 --on-signal SIGUSR1
        echo AHHHHHHHH!!!;
end

自分のシェル
(%selfプロセス展開 で自分自身のPIDを表す)
に対してシグナルを送信させます。

すると、
シグナルハンドラが実行されます。

$ kill -USR1 %self
AHHHHHHHH!!!
$ kill -USR2 %self
AHHHHHHHH!!!

SIGUSR1 に対して
何の反応もさせないようにします。

$ trap '' USR1
$ trap
function __trap_handler_USR1 --on-signal SIGUSR1
        ;
end
function __trap_handler_USR2 --on-signal SIGUSR2
        echo AHHHHHHHH!!!;
end
$ kill -USR1 %self

SIGUSR1 のシグナルハンドラを
削除します。

残ったシグナルハンドラは
SIGUSR2 のみです。

$ trap  USR1
$ trap
function __trap_handler_USR2 --on-signal SIGUSR2
        echo AHHHHHHHH!!!;
end
$ kill -USR1 %self
fishは終了する…

最後までお読みいただき、ありがとうございました。参考になれば嬉しいです。