有时,如果将剪贴板上的文本粘贴到 shell 中,并且其中包含回车符,则它会执行,尽管这并不是预期的。有时甚至可能会错误地粘贴多行,然后可能会运行非预期的命令。
我知道在完美的世界中,这些错误永远不会发生,但是有没有办法可以防止这种情况发生以避免人为错误的风险?
答案1
您需要的是“括号粘贴”,这是某些 shell 中提供的功能。
如果您的 bash 版本支持它,您可以像这样为当前会话打开它:
bind 'set enable-bracketed-paste on'
现在通过粘贴多行来尝试一下:
echo Hello world
echo Again, I say, hello!
shell 识别出文本是粘贴的(不是键入的),并等待您的确认。如果一切看起来安全,请按 Enter 键。如果不安全,请按 Control-C 取消。
如果您希望为每个新会话启用括号粘贴,请将命令添加到您的 .inputrc 文件中:
cd ~
echo "set enable-bracketed-paste" >> .inputrc
另一个选择是从狂欢到嘚,其中括号内的粘贴默认启用。要将当前 shell 替换为 zsh shell:
exec zsh
使用 zsh,粘贴的文本会突出显示,这很棒。再次按 Enter 执行命令或按 Control-C 取消。
如果你喜欢 zsh,并希望将其设为默认 shell:
chsh -s /bin/zsh
答案2
如果您在 Windows 上使用 PuTTY,这里有一个 AutoHotKey 脚本,它将检测您是否尝试将包含一个或多个换行符的内容粘贴到 PuTTY 中,如果是,它将确认您想要这样做。
提示:您可以按空格键或键盘上的回车键轻松按“是”。
注意:此脚本使用 ctrl+v 粘贴到 PuTTY,但如果您想将其挂接到 PuTTY 的右键单击粘贴默认功能,则可以替换^v
为。RButton
#ifwinactive ahk_class PuTTY
^v::
var := clipboard
var := RegExReplace(var, "\r\n?|\n\r?", "`n", lineNum)
If(lineNum>0)
{
MsgBox, 4, , There are one or more newlines in what you're pasting, are you sure you want to continue?
IfMsgBox Yes
SendInput {Shift down}{Insert}{Shift Up}
else IfMsgBox No
return
}
else
{
SendInput {Shift down}{Insert}{Shift Up}
}
return
#ifwinactive
答案3
粘贴前使用Ctrl
++ (“编辑当前X
Ctrl
行E
”)。这将启动您的默认编辑器;您必须保存并退出,然后粘贴的命令才会执行。
答案4
我也遇到过同样的问题,但后来我养成了粘贴完成后总是将一个单词复制到剪贴板的习惯。如果你强迫自己养成这个习惯 3-4 次,那么从那以后你的手就会自动这样做。自从我开始这个习惯以来,我从来没有粘贴错过。