Что вызывает копирование / вставку в терминале, чтобы иногда выполнять команду?

24

Когда вы вставляете какую-либо команду в терминал, она иногда автоматически выполняет команду (как если бы была нажата клавиша «Ввод»), иногда нет.

Я использовал Linux целую вечность, вставил тысячи команд в различные консоли на многих дистрибутивах, и я до сих пор не могу сказать, будет ли команда, которую я собираюсь вставить, выполнена автоматически или нет.

Что вызывает это поведение?

kursus
источник
5
Если вы хотите избежать беспокойства по этому поводу, введите { (w / space) перед вставкой, а затем завершите }. Он не влияет на работу вставленных команд, но не позволяет оболочке выполнять его, пока вы не закроете блок. Описано здесь [ gnu.org/software/bash/manual/html_node/Command-Grouping.html]
loa_in_

Ответы:

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символ в скопированном тексте.

IQAndreas
источник
5
Чтобы уменьшить сложность, я полностью проигнорировал упоминание о том, что Windows использует два разных ключа для возврата. Просто знайте, что это ежедневное горе и борьба, с которой нам приходится иметь дело.
IQAndreas
пробел является печатным символом
mikeserv
1
Может быть. Однако когда я тестирую вставку из Firefox в оболочку (с параметром stty, установленным в «raw»), строки заканчиваются символом новой строки, а не переводом каретки.
Томас Дики
1
Вам не нужно переходить на следующую строку, если вы выберете и переместите точку с запятой в достаточном количестве (2-3 символа), он выберет всю строку, что означает, что вы поймали себя на новой строке.
@ThomasDickey Вы в Windows или в системе на основе Unix?
IQAndreas
10

Когда вы выбираете текст, если вы случайно добавили (невидимую) новую строку в конце строки, он будет вставлен в текст. Это одинаково для всех известных мне эмуляторов терминала. Новая строка делает то, что вы называете «проверить».

В некоторых системах (например, в тех, которые используют синхронные терминалы, такие как IBM 3270), Enterключ «проверяет» экран путем копирования всех изменений на хост.

Томас Дики
источник
2

Другие ответы хорошо ответили на вопрос, но я подумал, что я также поделюсь решением для предотвращения случайного возникновения этого случая, если вы используете PuTTY в Windows - см. Https://serverfault.com/questions/731022/prevent-accidental -execution-of-commands-in-linux-if-pasteing-text-содержащий-one для деталей.

sa289
источник
2

Что вызывает это поведение?

Символ новой строки.

PSkocik
источник