我知道这dash
是一个“模型”shell - 它是最近编写的,而且写得很好,它只实现了 POSIX shell 所需的功能。我查看了 dash 源代码,以了解如何对诸如 shell 之类的程序进行“跟踪”。
对 dash 的“跟踪”是通过使用DEBUG
defined 编译它并使用 调用来执行的-o debug
。执行此操作时,trace
将打开一个文件,其中包含有关运行时正在执行的操作的fopen
信息。dash
但在我看来,整个机制不起作用,即使在这个“完美编写”的 shell 中也是如此。如果我在 shell 脚本中有这个:
exec 3>&1
此后的所有信息很可能不再转储到文件中,trace
而是最终出现在 上stdout
。这是因为fopen
调用open
和 可能会返回文件描述符 3。
这不是一个虚构的例子。现实世界中常用的脚本有这样的行
exec
数字>&1
(我在 2 个自动工具configure
脚本中看到了这一点:用于 IP Infusion 和 Kerberos 软件)。
那么当 shell 必须运行这样的脚本时,怎样对其进行调试/跟踪呢?
(我不是在寻找 shell 之外的工具 - 我想知道在诸如 shell 之类的程序内部进行跟踪的正确方法是什么。或者一般来说这是不可能的?)