私は以下を使用しています:
$ 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 -u
zshで実行すると、オプション設定なしでzshで実行されsource
ます)。-u
スクリプトの特定の機能によっては、異なる違い/例外がある可能性があります。