Bash 非実行関数の RETURN トラップ

Bash 非実行関数の RETURN トラップ

私は再びBashの落とし穴に陥り始めました。 RETURNトラップが関数を起動しないことを確認しました。

$ trap 'echo ok' RETURN
$ f () { echo ko; }
$ f
ko
$ . x
ok
$ cat x
$ 

ご覧のとおり、期待どおりに機能して空のファイルをインポートしてくださいx

バッシュはman次のとおりです。

sigspecがRETURNの場合、.shell関数またはスクリプトが実行されるたびにargコマンドが実行されます。または、ソース組み込みプログラムが実行を完了します。

それでは、私が何を見逃しているのでしょうか?

私はGNU bashバージョン4.4.12(1)-リリース(x86_64-pc-linux-gnu)を持っています。

ベストアンサー1

私が知る限り、私の質問の文書の断片には例外があります。スニペットは次のとおりです。

sigspecがRETURNの場合、.shell関数またはスクリプトが実行されるたびにargコマンドが実行されます。または、ソース組み込みプログラムが実行を完了します。

例外の説明は次のとおりです。

シェル実行環境の他のすべての側面は、以下を除いて関数と呼び出し元の間で同じです。DEBUGとRETURNトラップ(以下のSHELL BUILTIN COMMANDSの下の内蔵トラップの説明を参照してください)Traceプロパティ(以下の内部宣言の説明を参照)が指定されていない場合、またはset組み込み関数を使用して-o functraceシェルオプションが有効になっていない場合、関数は継承されません。(この場合、すべての機能は DEBUG および RETURN トラップを継承します。) -o errtrace シェル・オプションが有効でない場合、ERR トラップは継承されません。

の場合は、以下を使用して開くことができますfunctracetypeset-t

-t は各名前にトレース属性を提供します。トレース関数は呼び出しシェルから DEBUG および RETURN トラップを継承します。 Trace プロパティは変数に対して特別な意味を持ちません。

トリックもありますset -o functrace

ここに例があります。

$ trap 'echo ko' RETURN
$ f () { echo ok; }
$ cat y
f
$ . y
ok
ko
$ set -o functrace
$ . y
ok
ko
ko

の場合、declare別の-tオプションは次のとおりです。

-t は各名前にトレース属性を提供します。トレース関数は呼び出しシェルから DEBUG および RETURN トラップを継承します。 Trace プロパティは変数に対して特別な意味を持ちません。

extdebug関数追跡も有効にできます。イカチュウの答え

おすすめ記事