几个月前,系统更新导致我的 shell 在enter将命令粘贴到终端时不再将尾随换行符解释为 。例如,如果我ls
在提示符下编写,然后使用鼠标选择ls
直到行尾,我希望我可以中键单击粘贴到 shell 中并执行命令ls
。这是我多年来一直使用的标准行为。
然而,我的系统不再这样做了。我可以粘贴ls
,而且我可以看到换行符也被粘贴了,因为我的光标移到了下一行,但尽管如此,该命令在我按下之前不会执行 enter(我将其放在剧透中,因为它是一个动画 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
解决该问题:粘贴嵌入的换行符会再次执行粘贴的命令。
参考
- https://bugzilla.redhat.com/show_bug.cgi?id=1954366
- 括号粘贴模式- 康拉德·欧文,2013 年 4 月
请注意,这里和其他地方的许多经验丰富的用户强烈警告用户不要这样做。例如,@穆鲁写在评论中那, ”我强烈建议不要这样做。这一次可以防止您意外运行损坏/危险的命令,这意味着您因必须按 Enter 键而造成的所有不便都将得到补偿。”