次のスクリプトを試しました。
#!/bin/bash
trap 'echo "touching a file" && touch $FILE' EXIT
foo1(){
echo "foo1"
}
foo(){
echo "foo"
export FILE=${FILE:-/tmp/file1}
}
(foo1)
foo
上記のスクリプトの出力は次のとおりです。
[root@usr1 my_tests]# ./test.sh
foo1
foo
touching a file
foo1
しかし、私はトラップがサブシェルから呼び出される出口でも呼び出されると予想しました。
- これが期待されるか。
trap
サブシェルに継承されますか?- それでは、どのような状況で
trap
サブシェルに継承されますか?
ベストアンサー1
トラップハンドラはサブシェルから継承されません。これはPOSIXで指定:
無視されないトラップは、サブシェルに入るとデフォルトの動作に設定されます。
無視された信号(trap '' SIGFOO
)は、サブシェル(およびシェルによって開始された外部プログラム)ではまだ無視されます。