« 価格 | トップページ | Yash 2 その 36: トラップ »

2008年7月18日 (金)

Yash 2 その 35: トラップ

trap コマンドの実装が大体できた。

POSIX では trap コマンドを引数無しで実行するとその時設定してあるトラップの一覧が出力され後でそれをコマンドとして実行すると以前のトラップの設定を復元できるとしている:

save_traps=$(trap)
...
eval "$save_traps"

このコードは POSIX 規格の文書に例示されているものだが、trap コマンドをコマンド置換の中で実行していることが問題になる。コマンド置換はサブシェルで実行されるべきこととサブシェルではトラップがリセットされるべきことが POSIX では規定されているので、規定に従えばコマンド置換の中の trap コマンドは何も出力しない。よってこのコードでは save_traps 変数には空文字列が入り、後でそれを実行してもトラップは意図した通りには復元できない。

要するに POSIX の規格自体に矛盾があるわけだが、どうすべきか。Ksh と bash では特殊な処理をしているらしくこの様なコードでもトラップを復元できるが、zsh や dash ではできない。

|

« 価格 | トップページ | Yash 2 その 36: トラップ »

コメント

この問題は POSIX 2013 で規格が修正された

投稿: まじかんと | 2013年7月 7日 (日) 18時47分

Yash 2.39 で対応予定
https://osdn.jp/ticket/browse.php?group_id=3863&tid=35264

対応遅すぎた……

投稿: まじかんと | 2015年6月28日 (日) 15時52分

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: Yash 2 その 35: トラップ:

» Yash 2 その 36: トラップ [まじかんと雑記]
結局コマンド置換でもトラップの特別扱いはしないことにした。 [続きを読む]

受信: 2008年7月19日 (土) 14時15分

« 価格 | トップページ | Yash 2 その 36: トラップ »