Що призводить до копіювання / вставки в терміналі, щоб іноді виконувати команду?


24

Коли ви вставляєте якусь команду в термінал, вона іноді автоматично виконує команду (так само, якби була натиснута клавіша "Enter"), іноді ні.

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

Що викликає таку поведінку?


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


5
Щоб зменшити складність, я повністю проігнорував згадування про те, що Windows використовує два різні клавіші для повернення. Тільки знайте, що нам доводиться стикатися з щоденним горем і боротьбою.
IQAndreas

простір - друкарський персонаж
mikeserv

1
Можливо, Однак, коли я тестую пасту з Firefox в оболонку (з Stty встановлено "raw"), рядки закінчуються новими рядками - не поверненням каретки.
Томас Дікі

1
Вам не потрібно переходити до наступного рядка, якщо ви виберете та просуньте через крапку з комою достатню кількість (2-3 символи), він виділить увесь рядок, а це означає, що ви потрапили у новий рядок.

@ThomasDickey Ви перебуваєте в Windows чи на базі системи Unix?
IQAndreas

10

Коли ви вибираєте текст, якщо вам трапиться (невидимий) новий рядок в кінці рядка, він буде вкладеним текстом. Це відповідає всім емуляторам терміналів, про які я знаю. Новий рядок робить те, що ви називаєте "перевірити".

У деяких системах (наприклад, таких, що використовують синхронні термінали, такі як IBM 3270), Enterключ "перевірить" екран, скопіювавши всі зміни на хост.



2

Що викликає таку поведінку?

Персонаж нового рядка.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.