几个月前,系统更新导致我的 shell 不再将尾随换行符解释为enter将命令粘贴到终端时。例如,如果我ls
在提示符下写,然后使用鼠标选择ls
直到行尾,我希望我可以单击鼠标中键粘贴到 shell 中并ls
执行命令。这是我多年来一直使用的标准行为。
但是,我的系统不再这样做了。我可以粘贴ls
,并且我可以看到换行符也被粘贴了,因为我的光标移动到下一行,但尽管如此,命令在我按下之前不会执行 enter(我把它放在剧透中,因为它是一个动画 gif并且可能会分散注意力):
在上面的动画中,你可以看到我选择了ls
已经写入的行,然后清除ls
并中键粘贴。请注意光标是如何移动到下一行的,但此时ls
并没有执行该命令,而是在我按下我的enter键之后才执行该命令。
对我来说,真正奇怪的是,这不是我的终端仿真器 ( terminator
) 的问题。如果我 ssh 到另一台机器(但如果我 ssh 到 localhost),同一个终端将按预期解释换行符。所以它必须是我本地shell中的某种设置。
此外,它在一种情况下确实可以按预期工作:read
内置。在这里,如果我选择包含尾随换行符的行,我可以将其粘贴到等待read
提示符中,并将尾随换行符作为 EOL 字符,read
返回。那么为什么它在特定的环境之外不起作用呢?
所有这些都在 Arch Linux 系统上,使用GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
inemacs
模式。更令人困惑的是,我在使用bash
, zsh
or时遇到了这个问题fish
,但在使用ksh
, dash
, tcsh
or时没有csh
。在后四个 shell 中,我有我想要的行为,粘贴的行会立即执行。这可能与readline
?
我怎样才能恢复我想要的行为并解释粘贴到我的 shell 中的任何换行符?
行为更改在 RedHat https://bugzilla.redhat.com/show_bug.cgi?id=1954366的“不是错误”报告中捕获,该报告引用了
readline
设置enable-bracketed-paste
:实际上,添加此设置可以
~/.inputrc
解决问题:粘贴嵌入的换行符会再次执行粘贴的命令。参考
请注意,这里和其他地方的一些有经验的用户强烈警告用户不要这样做。例如,@muru在评论中写道,“这是我强烈建议不要做的事情。这会阻止你意外运行一个损坏/危险的命令,这意味着你每次都受到轻微的不便必须按 Enter 才能得到报酬。 ”