为什么终端在粘贴文本后自动执行我的命令?

为什么终端在粘贴文本后自动执行我的命令?

无论我使用 ctrl+shift+v 还是从右键单击菜单粘贴,都会发生这种情况。

可以采取什么措施来防止这种行为?

答案1

不要复制多行文本进行粘贴。我几乎可以保证您只是复制了该行的最后一部分。如果您三次单击以复制要粘贴的该行代码,则会在该行末尾看到换行符。如果您想确定这确实是问题所在,请复制整行(最后一个字母/数字除外),然后查看粘贴时是否还包含换行符。

答案2

您粘贴的文本包含尾随换行符。当您粘贴换行符时,终端中运行的 shell 会将其视为按下Enter,因此它会执行该命令。

粘贴操作由终端仿真器执行;它将粘贴的文本传递到终端中运行的应用程序,就像传递用户键入的文本一样。看键盘输入和文本输出如何工作?有关输入如何工作的更多信息。应用程序(此处为 shell)无法区分击键和粘贴操作。

现在许多终端模拟器都支持括号内的粘贴。在括号粘贴模式下,应用程序区分粘贴操作和击键。仅当应用程序对粘贴的文本执行不同的操作时,括号内的粘贴才有用,因此它是通过支持应用程序启用的,而不是由终端仿真器的用户配置的。

Zsh 5.1(几周前发布,因此在大多数发行版中尚不可用)添加了对括号粘贴模式的支持。当您粘贴文本时,它只是插入到命令行中,您可以在按Enter执行命令行之前对其进行编辑。

oh-my-zsh 的用户可以使用安全粘贴插件即使在 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 和 X11 之间共享剪贴板对于 bash 中类似的东西。

答案3

如果您使用 bash 作为 shell,则可以按Ctrl-X Ctrl-E调出编辑器(由 $VISUAL 或 $EDITOR 定义,例如vi或可能nano)。

然后,您可以将命令粘贴到其中,就像编辑文件一样。如果您保存并退出,它们将被执行。或者如果您退出而未保存则取消。

答案4

在文本编辑器窗口中,使用以下快捷方式复制不带 \n(换行符)的文本:

  • Shift+ Home, Ctrl+ Insert– 复制光标之前的行的一部分。
  • Shift+ End, Ctrl+ Insert– 复制光标后的部分行。
  • Home, Shift+ End, Ctrl+ Insert– 复制所有不带 \n 的行。

在浏览器窗口或文本不可编辑的其他内容中,使用以下两种技术之一:

  • 首先复制到文本编辑器(首选,因为这样您就有机会编辑命令)。
  • 仅选择该行上的文本(不将选择区域向右延伸到最后一个字符之外),然后Ctrl+Insert并粘贴到终端窗口。

正确的选择(没有 \n)看起来如何:

ls -al

错误的选择(带有 \n)看起来如何:

ls -al

相关内容