我再次涉足 Bash 中的陷阱。我刚刚注意到 RETURN 陷阱不会触发函数。
$ trap 'echo ok' RETURN
$ f () { echo ko; }
$ f
ko
$ . x
ok
$ cat x
$
Run Code Online (Sandbox Code Playgroud)
如您所见,它按预期用于采购空文件 x。
Bash 是man这样的:
如果 sigspec 是 RETURN,则每次使用 . 或源内置函数完成执行。
那我还缺什么?
我有 GNU bash,版本 4.4.12(1)-release (x86_64-pc-linux-gnu)。
小智 6
据我了解,我的问题中的文档片段有一个例外。片段是:
如果 sigspec 是 RETURN,则每次使用 . 或源内置函数完成执行。
此处描述了异常:
shell 执行环境的所有其他方面在函数和它的调用者之间是相同的,但有以下例外:DEBUG 和 RETURN 陷阱(请参阅下面的 SHELL BUILTIN COMMANDS 下的内置陷阱描述)不会被继承,除非函数已被赋予跟踪属性(请参阅下面的declare builtin 的描述)或使用set builtin 启用了-o functrace shell 选项(在这种情况下,所有函数都继承了DEBUG 和RETURN 陷阱),并且ERR 陷阱不会被继承,除非-o errtrace shell 选项已启用。
至于functrace,它可以通过typeset's开启-t:
-t 为每个名称指定跟踪属性。跟踪函数从调用 shell 继承 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
Run Code Online (Sandbox Code Playgroud)
至于declare,它又是一个-t选项:
-t 为每个名称指定跟踪属性。跟踪函数从调用 shell 继承 DEBUG 和 RETURN 陷阱。trace 属性对变量没有特殊意义。
还extdebug启用函数跟踪,如ikkachu's answer。