-T が設定されているにもかかわらず、bash DEBUG トラップはサブシェルから継承されません。

-T が設定されているにもかかわらず、bash DEBUG トラップはサブシェルから継承されません。

私は以下を使用しています:

$ bash --version
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)

一方:

#!/bin/bash
validate() {
    if [[ "$BASH_COMMAND" == whoami ]]; then
        echo "whoami detected!"
    fi
}
$ set -T
$ trap 'validate' DEBUG
$ shopt -s extdebug

その後、を書くとwhoami「whoami検出器」が表示されます。

しかし、スクリプトを使用している場合:

#!/bin/bash
whoami

そして実行してください:

./script.sh

メッセージを受信できませんでした。

~によると文書:

-T を設定すると、DEBUG と RETURN のすべてのトラップがシェル関数、コマンド、サブシェル環境で実行されるコマンド。この場合、DEBUG および RETURN トラップは通常継承されません。

なぜ動作しないのですか?

これはwhoami説明目的でのみ使用されます。

答え1

実行スクリプトは、./script.shサブシェルでは実行されませんが、親シェルからシェル状態(トラップなど)を継承しない新しいシェルで実行されます。このStackoverflowの質問に対する私の答えを確認してください。「bashスクリプトは新しいシェルで実行されますか、それともサブシェルで実行されますか?」詳細については。

サブシェルからスクリプトを実行するには、次のようにサブシェルを作成するか、そのサブシェル( )sourceスクリプト.を実行します。

(source script.sh)

これは親シェルのコンテキストでスクリプトを実行するため、一部のものは通常実行するのとは異なります(セルフシェルを使用)。まず、shebang行はすべてのオプションを含めて無視されます(たとえば、shebang行がですが#!/bin/bash -uzshで実行すると、オプション設定なしでzshで実行されsourceます)。-uスクリプトの特定の機能によっては、異なる違い/例外がある可能性があります。

関連情報