Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー160本ノック第2章4節練習問題その1

練習2.4.a シグナルの操作

プロセスを止める kill コマンドの使い方の説明がされていた。一つ気になったのは、ジョブ番号を与えてもプロセスを止められるそうだがその時に使う % の用法の説明がマニュアルの中に見当たらないということだ。info にも書いてなかったのでとても気になる。

 

練習2.4.b シグナルの種類

kill コマンドというのは他のプロセスにシグナルを送っているのだという話がされていた。kill -l で送れるシグナルの一覧が出てくる。

Ctrl+C で何をしているのかも説明されていた。SIGINTというシグナルを送ってプロセスを止めているらしい。

trap というコマンドが解説で出てきたがこれは知らなかった。bash の機能らしい。

 

trap [-lp] [[arg] sigspec ...]
 シェルがシグナル sigspec を受け取ると、コマンド arg が読み込まれて、実行されます。 arg が存在しない (かつ  sigspec が一つ指定された) 場合か、 arg が - の場合、 指定されたシグナルは全てオリジナルの動作 (シェルの起動時に設定されていた値) にリセットされます。 arg が空文字列である場合、それぞれの sigspec  で指定されたシグナルは、  シェルとシェルが起動したコマンドから無視されます。 arg なしで -p オプションが与えられた場合、 各 sigspec に関連付けられた trap コマンドが表示されます。 引き数が全くないか、 -p だけが与えられた場合、  trap は各シグナルに関連付けられたコマンドのリストを出力します。 -l オプションを与えると、シェルはシグナル名と対応する番号のリストを出力します。 それぞれの sigspec は、<signal.h> で定義されているシグナル名、またはシグナル番号です。  シグナル名は大文字小文字は区別されず、先頭の  SIG  は省略可能です。

sigspec が EXIT (0) であれば、シェルの終了時にコマンド arg が実行されます。  sigspec  が  DEBUG  であれば、各々の  単純なコマンド、for  コマンド、case  コマンド、select  コマンド、各々の算術  for コマンドの前、およびシェル関数の最初のコマンドの実行前 (前述の シ実行されます。  DEBUG のトラップの影響についての詳細は組み込みコマンド shopt の extdebug オプションの説明を参照してください。 sigspec  が  RETURN  であれば、シェル関数の実行、または組み込みコマンドの  .  やsource で実行されたスクリプトの実行が終わるたびにコマンド arg が実行されます。sigspec  が ERR であれば、 単純なコマンドが 0 以外の終了ステータスのときにコマンド arg が実行されます。ただし、失敗したコマンドが、 while または until キーワード直後のコマンドリストに含まれる場合、 if  文の条件に含まれる場合、 && や || のリスト中で実行するコマンドに含まれる場合、 および、コマンドの戻り値が !で反転されている場合には、 ERR のトラップは実行されません。 これらは errexit オプションが従う条件と同じです。

設問ではシングルクォートで空文字列を表現している。仕様通り確かにシグナルを無視するようだ。