是什么导致终端中的复制/粘贴有时会执行命令?

是什么导致终端中的复制/粘贴有时会执行命令?

当您在终端中粘贴某些命令时,它有时会自动执行该命令(就像按下“Enter”键一样),有时则不会。

我已经使用 Linux 很长时间了,在许多发行版的各种控制台中粘贴了数千条命令,但我仍然无法判断我要粘贴的命令是否会自动执行。

是什么触发了这种行为?

答案1

您正在复制的文本中的回车字符触发了自动执行。

让我们举一个不同的例子,一次性复制这些行并将它们粘贴到您的终端中:

echo "Hello";
echo "World";

如果您查看终端,您将不会看到以下内容:

$ echo "Hello";
echo "World";

你会看到这个(也可能有一行说World):

$ echo "Hello";
Hello
$ echo "World";

不是等待所有输入被粘贴,而是执行第一行(出于同样的原因,第二行也可能会或可能不会执行)。这是因为RETURN两行之间有一个字符。

当您按下ENTER键盘上的按键时,您所做的只是发送 ASCII 值为 的字符13。您的终端会立即检测到该字符,并知道它具有特殊指令来执行您到目前为止所输入的内容。

当存储在计算机上或打印在屏幕上时,该RETURN字符就像字母表中的任何其他字母、数字或符号一样。该字符可以使用退格键删除,或者像任何其他常规字符一样复制到剪贴板。

唯一的区别是,当您的浏览器看到该字符时,它知道而不是印刷一个可见的字符,它应该以不同的方式对待它,并且有特殊的指令将下一组文本向下移动到下一行。由于这个原因,字符RETURNSPACE字符 (ascii 32) 以及其他一些很少使用的字符被称为“非打印字符”。

有时,当您从网站复制文本时,很难仅复制文本而不复制末尾的回车符(并且页面上的样式通常会使情况变得更加困难)。


实验时间!

下面您将找到两个命令来说明问题,并且您可以“练习”。将光标放在箭头之前echo并拖动,直到突出显示位于箭头之前:

echo "Wait for my signal...";<- End cursor here right after the semicolon

现在尝试第二个命令。将光标从前面开始echo,然后向下拖动,直到光标位于第二行,但位于箭头的正前方<-。复制它,然后将其粘贴到您的终端中:

echo 'Go go go!';
<- End cursor here right before the arrow

根据您的浏览器,您甚至可能看不到您选择的文本是否超过了两行。但是当您将其粘贴到终端时,您会发现它执行了该行,因为它RETURN在复制的文本中找到了一个字符。

答案2

当您选择文本时,如果您碰巧在行尾包含(不可见的)换行符,它将出现在粘贴的文本中。据我所知,这在所有终端模拟器中都是一致的。换行符执行您所说的“验证”。

在某些系统上(例如使用 IBM 3270 等同步终端的系统),按键Enter将通过将所有更改复制到主机来“验证”屏幕。

答案3

是什么触发了这种行为?

换行符。

答案4

其他答案很好地回答了这个问题,但我想我还会分享一个解决方案,以防止您在 Windows 上使用 PuTTY 时意外发生这种情况 - 请参阅https://serverfault.com/questions/731022/prevent-accidental-execution-of-commands-in-linux-if-pasting-text-containing-one了解详情。

相关内容