トラップはサブシェルに継承されますか?

トラップはサブシェルに継承されますか?

次のスクリプトを試しました。

#!/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)は、サブシェル(およびシェルによって開始された外部プログラム)ではまだ無視されます。

おすすめ記事