- 書式
- trap [OPTIONS] [[ARG] SIGSPEC ... ]
概要
trap
コマンドは
fishの イベント受信フレームワーク の
ラッパーです。
POSIXシェルに対する
後方互換性のために
存在しています。
そうでなければ、
functionでイベントハンドラーを定義
してください。
以下のパラメータがあります。
ARG
- シグナルを受信したときに実行されるコマンド
SIGSPEC
- シグナル名
-l
/--list-signals
- シグナル名一覧を表示する
-p
/--print
- 定義済の全シグナルハンドラを表示する
-
ARG
とSIGSPEC
が両方指定されたとき
ARG
はシグナルSIGSPEC
を受信したときに実行されるコマンドARG
が空文字のとき、
SIGSPEC
で指定された各シグナルに対して何も反応しなくなる
ARG
を指定しない場合(SIGSPEC
のみ)または-
であるとき
- 指定された各シグナルは元の振る舞いに戻る
- シェル起動時点での設定
- たとえば
SIGUSR1
/SIGUSR2
は終了するなど
- 指定された各シグナルは元の振る舞いに戻る
-p
が指定されたとき
trap
によって各シグナルハンドラが表示される
シグナル名は
大文字小文字を区別しません。
SIGプレフィクスは省略可能です。
終了ステータス は
SIGSPEC
が不正であるときに1- そうでないときに0
となります。
実行例
シェルに SIGUSR1
が
送信されたときは毎回
スタックトレース を表示します。
$ trap 'status --print-stack-trace' SIGUSR1
実行例(詳細追加)
SIGUSR1
と SIGUSR2
に
シグナルハンドラを追加します。
最初は
何のシグナルハンドラも
定義されていないので、
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 -p
と trap
は同じです。
$ 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は終了する…
最後までお読みいただき、ありがとうございました。参考になれば嬉しいです。