使尾随换行符在粘贴到 shell 中时执行命令

ter*_*don 11 shell bash readline

几个月前,系统更新导致我的 shellenter在将命令粘贴到终端时不再将尾随换行符解释为 。例如,如果我ls在提示符下编写,然后使用鼠标选择ls直到行尾,我希望我可以中键单击粘贴到 shell 中并执行命令ls。这是我多年来一直使用的标准行为。

然而,我的系统不再这样做了。我可以粘贴ls,而且我可以看到换行符也被粘贴了,因为我的光标移到了下一行,但尽管如此,该命令在我按下之前不会执行 enter(我将其放在剧透中,因为它是一个动画 gif并且可能会分散注意力):

显示所描述效果的动画 gif

在上面的动画中,您可以看到我选择了已写入的行ls,然后清除ls并单击中键粘贴。请注意光标如何移动到下一行,但该ls命令并未在此时执行,而是仅在我按下enter按键后执行。

对我来说,真正奇怪的是,这不是我的终端模拟器 ( ) 的问题terminator。如果我 ssh 到另一台机器(但如果我 ssh 到本地主机,则不会),同一个终端将按预期解释换行符。所以它必须是我本地 shell 中的某种设置。

此外,在一种环境下它确实可以按预期工作:read内置环境。在这里,如果我选择包含尾随换行符的行,我可以将其粘贴到等待read提示中,并且尾随换行符将被视为 EOL 字符,从而read返回。那么为什么它在特定环境之外不起作用呢?

所有这一切都是在 Arch Linux 系统上,使用GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)inemacs模式。更令人困惑的是,我在使用bash,zsh或 时遇到此问题fish,但在使用ksh, dash,tcsh或 时则没有csh。在后四个 shell 中,我有我想要的行为,并且粘贴的行立即执行。这可能与 相关吗readline

如何恢复我想要的行为并解释粘贴到 shell 中的任何换行符?

roa*_*ima 15

RedHat https://bugzilla.redhat.com/show_bug.cgi?id=1954366的“不是错误”报告中捕获了行为更改,该报告引用了以下readline设置enable-bracketed-paste

添加set enable-bracketed-paste Off.inputrc修复它。但它一开始就不应该被打破。

事实上,添加此设置可以~/.inputrc解决该问题:粘贴嵌入的换行符会再次执行粘贴的命令。

参考

请注意,这里和其他地方的许多经验丰富的用户强烈警告用户不要这样做。例如,@muru在评论中写道:“这是我强烈建议不要做的事情。一旦这将阻止您意外运行损坏/危险的命令,则意味着您每次都会受到轻微的不便。必须按回车键才会付款。