使用 $_ 时出现“__bp_preexec_invoke_exec:没有此文件或目录”

使用 $_ 时出现“__bp_preexec_invoke_exec:没有此文件或目录”

我正在尝试使用 在 Bash 上使用 创建一个新目录并同时在一行命令中切换到它mkdir repo && cd $_。以前在所有 Linux 发行版上,这种方法都运行良好,但现在当我在 Elementary OS 5 上尝试时,它抛出了以下错误:

:~$ mkdir repo && cd $_
bash: cd: __bp_preexec_invoke_exec: No such file or directory

这是 Bash 的问题吗?我们该如何修复它?

答案1

这不是一个单独的 Bash 的问题。

我的猜测是某些东西(终端模拟器?)与 Bash 集成,定义__bp_preexec_invoke_exec函数并设置DEBUG使用该函数的陷阱。

SO上有一个问题:bash:$_DEBUG陷阱中保存. 来自其中:

使用DEBUG陷阱时,$_基于陷阱运行的最后一个命令 [...] 而不是用户输入的最后一个命令

回答

值得注意的是,“最后执行的命令的最后一个参数”包括文字文本“最后执行的命令”,而不是“用户输入的最后一个命令”;bash 在这方面的表现与其文档所承诺的一致。

但不用担心:除非你的陷阱返回非零值(并因此中止它们之前运行的命令),否则这很容易解决:

trapfunc() { local old_=$1; date; : "$old_"; }
trap 'trapfunc "$_"' DEBUG

例如,以 iTerm2 为例。它使​​用__bp_preexec_invoke_exec(请注意,在您的特定情况下,可能是其他使用相同名称用于相同目的的程序)。在我写这个答案的时候,您可以在https://iterm2.com/shell_integration/bash

# This function is installed as the DEBUG trap.  It is invoked before each
# interactive prompt display.  Its purpose is to inspect the current
# environment to attempt to detect if the current command is being invoked
# interactively, and invoke 'preexec' if so.
__bp_preexec_invoke_exec() {
    # Save the contents of $_ so that it can be restored later on.
    # https://stackoverflow.com/questions/40944532/bash-preserve-in-a-debug-trap#40944702
    __bp_last_argument_prev_command="$1"

该函数继续,然后

__bp_set_ret_value "$preexec_ret_value" "$__bp_last_argument_prev_command"

}

其他地方(__bp_install):

trap '__bp_preexec_invoke_exec "$_"' DEBUG

因此它基本上使用了链接答案中的解决方案。请注意,代码甚至提到了链接的问题!

您应该找出您的漏洞来源__bp_preexec_invoke_exec,并根据可能的trap '__bp_preexec_invoke_exec' DEBUG漏洞进行相应的修补。或者,可能已经修补了罪魁祸首软件,您只需进行更新即可。

相关内容