為什麼終端在粘貼文本後會自動執行我的命令?
無論我使用 ctrl+shift+v 還是從右鍵菜單粘貼都會發生這種情況。
可以做些什麼來防止這種行為?
不要複製多行文本來粘貼。我幾乎可以保證您只是在複製該行的最後一部分。如果您三次點擊以複製您正在粘貼的那行程式碼,那麼您將在行尾獲得換行符。如果你想確定,這確實是問題所在,然後複製整行,除了最後一個字母/數字,看看粘貼是否還包括換行符。
您粘貼的文本包含一個尾隨換行符。當您粘貼換行符時,在終端中執行的 shell 會將其視為按
Enter
,因此它會執行該命令。粘貼操作由終端仿真器執行;它將粘貼的文本傳遞給終端中執行的應用程序,就像傳遞使用者鍵入的文本一樣。請參閱鍵盤輸入和文本輸出如何工作?有關輸入如何工作的更多資訊。應用程序(這裡是外殼)無法區分擊鍵和粘貼操作。
如今,許多終端仿真器都支持括號粘貼。在括號粘貼模式下,應用程序可以區分粘貼操作和擊鍵。括號粘貼僅在應用程序對粘貼的文本執行不同操作時才有用,因此它是通過支持應用程序啟用的,它不是由終端仿真器的使用者配置的。
Zsh 5.1(幾週前發布,因此在大多數發行版中尚不可用)增加了對括號粘貼模式的支持。當您粘貼文本時,它只是插入到命令行中,您可以在按下
Enter
執行命令行之前對其進行編輯。即使在早期版本的 zsh 中,oh-my-zsh 的使用者也可以使用安全粘貼外掛。
您可以在 zsh 中做的另一件事是將選擇作為字元串插入,並帶有引號(以反斜杠的形式在每個 shell 特殊字元之前,例如空格)。鍵入
xsel
以獲取主要選擇(自動滑鼠選擇),或xsel -b
獲取剪貼板內容(使用Ctrl
+複製的文本C
),然後按Tab
。如果你有一個較舊的 zsh 版本並且你想插入剪貼板內容而不引用,你可以定義一個插入選擇的函式。
function zle_insert_x_selection { LBUFFER+=$(xsel ${NUMERIC+-b} -o </dev/null) } zle -N zle_insert_x_selection bindkey '\e\C-v' zle_insert_x_selection
有了這個
.zshrc
,您可以按Ctrl
+Alt
+V
插入主要選擇,或Ctrl
+U
Ctrl
+Alt
+V
插入剪貼板內容。它們被插入到游標之前,除了沒有尾隨換行符之外保持不變。有關 bash中的類似內容,請參閱在 bash 和 X11 之間共享剪貼板。