粘貼到 shell 時,使尾隨換行符執行命令
幾個月前,系統更新導致我的 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
:添加
set enable-bracketed-paste Off
到.inputrc
修復它。但它不應該一開始就被打破。實際上,添加此設置可以
~/.inputrc
解決問題:粘貼嵌入的換行符會再次執行粘貼的命令。參考
- https://bugzilla.redhat.com/show_bug.cgi?id=1954366
- 括號粘貼模式- Conrad Irwin,2013 年 4 月
**請注意,這里和其他地方的一些有經驗的使用者強烈警告使用者不要這樣做。**例如,@muru在評論中寫道,“這是我強烈建議不要做的事情。這會阻止你意外執行一個損壞/危險的命令,這意味著你每次都受到輕微的不便必須按 Enter 才能得到報酬。 ”