我正在尝试使用 在 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
漏洞进行相应的修补。或者,可能已经修补了罪魁祸首软件,您只需进行更新即可。