2014年1月23日木曜日

シェルスクリプトで trap にシグナル 0 を指定する意味

slapdの起動スクリプト(/etc/init.d/slapd)をカスタマイズしている時に、
trap コマンドにシグナル 0 を指定している記述を見つけた。
該当箇所はこんな感じになっている。

start_ldap() {
  trap 'report_failure' 0
  log_daemon_msg "Starting OpenLDAP" "slapd"
  start_slapd
  trap "-" 0
  log_end_msg 0
}

trapの意味は第1引数に実行するコマンド、第2引数以降は捕捉するシグナルだけれども、POSIXの定義には0という値のシグナルはない。では0を指定している意味はなんだろう?
と思って更に調べると見つかった。
http://shellscript.sunone.me/signal_and_trap.html

どうやら、シェルスクリプトが終了するときのEXITシグナルを補足することで、シェルスクリプト終了時に必ず実行される処理を指定できるということらしい。そして trap の第2引数に 0 と書くと EXIT と書いたのと同じ意味になるということだ。

上記リンク先の解説によると
exit するルートが複数存在し、かつ終了時に共通の処理を行う必要があるシェルスクリプトにおいては非常に有効である。
とのことだ。
なお、EXITの他にもDEBUG、ERR、RETURNがあるようだ。下記URLを参照。
http://fumiyas.github.io/2013/12/05/trap-exit.sh-advent-calendar.html

ちなみに冒頭で引用したスクリプトで trap の第1引数に "-" を指定している部分は捕捉を無効化するという意味。使い方的には try 〜 catch 構文を連想するなぁ。

※この記事について指摘・意見・提案・感想などありましたら下のコメント欄にどうそ。

0 件のコメント:

コメントを投稿