为什么 bash 在编辑并执行命令后打印调试陷阱

为什么 bash 在编辑并执行命令后打印调试陷阱

我在 bash 中发现了一种我无法解释的行为(或者是 readline?)。调用edit-and-execute-commandReadline 命令后,调试陷阱的命令将在执行之前打印。这是一个错误吗?

以下是如何使用默认的 bash 安装重现该问题(除了 /etc 中的点文件之外,没有点文件,并且它发生在 Linux 和 macOS 上,以及我能找到的所有 bash 版本):

bash-5.0$ trap date DEBUG
bash-5.0$ echo hi
Fri May  1 23:07:38 PDT 2020
hi
bash-5.0$ echo hi

此时,输入 Control-X Control-E。编辑器打开。退出编辑器。这就是您接下来看到的:

echo hi
date
Fri May  1 23:07:47 PDT 2020
hi
bash-5.0$ echo hi

date我的问题是退出编辑器后shell 是否有充分的理由进行打印。

这对我来说是一个问题的原因是,我使用调试陷阱在用户输入命令之后但在运行 iTerm2 的 shell 集成之前运行命令https://github.com/rcaloras/bash-preexec。 AFAIK 在 bash 中没有其他方法可以做到这一点(尽管我对替代方案持开放态度!)

对于上下文,它最初出现在这里:https://gitlab.com/gnachman/iterm2/-/issues/8808#note_331367916

答案1

我很幸运,在 bash 源代码中找到了几乎令人满意的答案。这里有详细的说明:https://gitlab.com/gnachman/iterm2/-/issues/8808#note_335276685

相关内容