しらいです。

In article <uy8c6wdkr.fsf@anet.ne.jp>,
OOTANI TAKASHI  <tksotn@anet.ne.jp> wrote:
>大谷です。

>でも、シェルはexitしたことになると思います。

 私の感覚ではそれも違うと思います。事故死と自然死の違いとい
うか、とにかく、exit(3) なり _exit(2) なり main() の return
なり以外で終了したものを「exit」ってのは言い過ぎかと。


>シグナルを起因としてそれをトラップして後処理してから終了するのは
>exitと呼ばないということは無いですよね。

 具体的な処理は bash の source 見ると判ると思いますが、必要
最低限の後処理をした後は、handler を SIG_DFL に戻して改めて
自分自身に SIGHUP をかけるという手順になります。
 その結果 bash は終了する訳ですが、これは決して exit した訳
ではなくて SIGHUP の default 動作に従って終了しただけのこと
です。OS 設定によっては終了しない可能性だってあり得るでしょ
う。ま、普通は死ぬけど。

 man page の英文を丁寧に追っていくと、同じ「終了」でも普通
は「exit」と自動詞なのに signal による終了は「terminate」と
他動詞になっているのに気づくと思います。
 つまり、普通は bash 自身の意志で「終了する」のに signal を
受けた時には「終了させられる」訳ですよね。これはやっぱり区別
して取り扱われて然るべきかと。

 そういう「終了させられる」際にまで logout 処理を期待してし
まうと、SIGSEGV のように core 吐いて死んじゃう時や、SIGKILL
のように trap する術さえない時にまで logout 処理を期待するこ
とになるんじゃないでしょうかね。


>man の trap ... 0 の説明も、on exit で実行されると書いてあり、
>実際、SIGHUPで終了する時にも trap ... 0 で指定したコマンドは
>実行されます。
>同じexitという言葉が使われているのに .bash_logoutは読まれずに、
>trap ... 0 は実行されるのでは言葉の意味が不統一です。

 うん、これは確かに首尾一貫していませんね。でも経緯から考え
ると trap の場合は強制終了でも実行されるというのはまだ納得が
いきます。
 そもそもの用途を考えてみると、trap は signal で強制終了さ
せられる時に適切な後処理を行なえるように設けられている仕組み
なので、「exit」じゃない時にも対応出来て然るべきでしょう。
 しかし、.bash_logout の方は名前から見ても logout 処理用と
しか考えられない訳で、強制終了を念頭に置いた用途とは分けて捉
えるべきではないでしょうか。

# だけど、SIGHUP の時にやって欲しい処理なら 0 じゃなくて 1
#で trap かければ済む話なので、個人的には trap 0 しか指定し
#てない時に SIGHUP でまで実行されちゃうのはやだなー。
# source 読む限りでは Bourne shell だと強制終了時には trap
#0 指定の command を実行しないみたいに読めますけどねー。

-- 
                                               しらい たかし