Yash 2 その 35: トラップ
trap コマンドの実装が大体できた。
POSIX では trap コマンドを引数無しで実行するとその時設定してあるトラップの一覧が出力され後でそれをコマンドとして実行すると以前のトラップの設定を復元できるとしている:
save_traps=$(trap)
...
eval "$save_traps"
このコードは POSIX 規格の文書に例示されているものだが、trap コマンドをコマンド置換の中で実行していることが問題になる。コマンド置換はサブシェルで実行されるべきこととサブシェルではトラップがリセットされるべきことが POSIX では規定されているので、規定に従えばコマンド置換の中の trap コマンドは何も出力しない。よってこのコードでは save_traps 変数には空文字列が入り、後でそれを実行してもトラップは意図した通りには復元できない。
要するに POSIX の規格自体に矛盾があるわけだが、どうすべきか。Ksh と bash では特殊な処理をしているらしくこの様なコードでもトラップを復元できるが、zsh や dash ではできない。
| 固定リンク
コメント
この問題は 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分