web-dev-qa-db-ja.com

ダッシュ対kshおよびbashでトラップを終了します

これは、現在のディレクトリに一時ディレクトリを設定し、終了時にそれを削除するトラップを設定する簡単なスクリプトです。

#filename: script   
set -x  
trap 'rm -rf "$d"' exit
d=`TMPDIR=$PWD mktemp -d`
"$@"

私が行った場合 ksh script sleep 100またはbash script sleep 100およびC-C、トラップが実行され、ディレクトリが削除されます。 dashでは機能しません。どうして?これはバグですか、それとも意図した動作ですか?

5
PSkocik

警告:exitの動作は保証されていません。代わりに、EXITを使用する必要があります。

POSIX標準では、シグナルの場合にEXITトラップも実行する必要があるかどうかが定義されておらず、Bourne ShellがEXITトラップを呼び出さないという事実が与えられている場合、nspecified動作を入力していることは明らかです。

1
schily