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


24

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

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

是什么触发了这种行为?


5
如果要避免担心这一点,请{ 在粘贴之前输入(带空格),然后以结束}。它对粘贴命令的工作没有影响,但是会阻止shell在关闭该块之前执行它。在此处描述[ gnu.org/software/bash/manual/html_node/Command-Grouping.html]
loa_in_

Answers:


37

正是您要复制的文本中的返回字符触发了自动执行。

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

echo "Hello";
echo "World";

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

$ echo "Hello";
echo "World";

您将看到以下内容(可能还会有一行显示World):

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

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

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

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

唯一的区别是,当您的浏览器看到该字符时,它知道与其打印可见的字符,还不如打印一个可见的字符,并且具有特殊的说明将下一组文本下移到下一行。由于这个原因,该RETURN字符和该SPACE字符(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在复制的文本中找到了一个字符。


5
为了降低复杂性,我完全没有提及Windows使用两个不同的键进行返回的情况。只知道这是我们每天必须面对的祸患和斗争。
IQAndreas 2015年

空间是一个印刷字符
mikeserv 2015年

1
也许。但是,当我测试从Firefox到外壳的粘贴(将stty设置为“ raw”)时,这些行以换行符结尾-而不是回车符。
Thomas Dickey

1
您无需移动到下一行,如果您选择并移动了足够多的分号(2-3个字符),它将选择整行,这意味着您已换行。

@ThomasDickey您是在Windows还是基于Unix的系统上?
IQAndreas 2015年

10

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

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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.