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

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

几个月前,系统更新导致我的 shell 在enter将命令粘贴到终端时不再将尾随换行符解释为 。例如,如果我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 中的任何换行符?

答案1

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

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

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

参考

请注意,这里和其他地方的许多经验丰富的用户强烈警告用户不要这样做。例如,@穆鲁在评论中那, ”我强烈建议不要这样做。这一次可以防止您意外运行损坏/危险的命令,这意味着您因必须按 Enter 键而造成的所有不便都将得到补偿。

相关内容