私は再び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 トラップは継承されません。
の場合は、以下を使用して開くことができますfunctrace
。typeset
-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
関数追跡も有効にできます。イカチュウの答え。