Bash

粘貼到 shell 時,使尾隨換行符執行命令

  • May 11, 2022

幾個月前,系統更新導致我的 shell 不再將尾隨換行符解釋為enter將命令粘貼到終端時。例如,如果我ls在提示符下寫,然後使用滑鼠選擇ls直到行尾,我希望我可以點擊滑鼠中鍵粘貼到 shell 中並ls執行命令。這是我多年來一直使用的標準行為。

但是,我的系統不再這樣做了。我可以粘貼ls,並且我可以看到換行符也被粘貼了,因為我的游標移動到下一行,但儘管如此,命令在我按下之前不會執行 enter(我把它放在劇透中,因為它是一個動畫 gif並且可能會分散注意力):

顯示所描述效果的動畫 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, zshor時遇到了這個問題fish,但在使用ksh, dash, tcshor時沒有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解決問題:粘貼嵌入的換行符會再次執行粘貼的命令。

參考

**請注意,這里和其他地方的一些有經驗的使用者強烈警告使用者不要這樣做。**例如,@muru在評論中寫道,“這是我強烈建議不要做的事情。這會阻止你意外執行一個損壞/危險的命令,這意味著你每次都受到輕微的不便必須按 Enter 才能得到報酬。

引用自:https://unix.stackexchange.com/questions/689394