Co powoduje, że polecenie kopiuj / wklej w terminalu czasami wykonuje polecenie?

24

Kiedy wkleisz jakieś polecenie w terminalu, czasami automatycznie wykona ono polecenie (tak jak po naciśnięciu klawisza „Enter”), a czasem nie.

Od wieków używam Linuksa, wkleiłem tysiące poleceń w różnych konsolach na wielu dystrybucjach i nadal nie jestem w stanie stwierdzić, czy polecenie, które zamierzam wkleić, zostanie wykonane automatycznie, czy nie.

Co powoduje takie zachowanie?

kursus
źródło
5
Jeśli chcesz uniknąć martwienia się o to, { przed wklejeniem wpisz (w / spacja), a następnie zakończ }. Nie ma to wpływu na działanie wklejonych poleceń, ale zapobiega wykonywaniu go przez powłokę do momentu zamknięcia bloku. Opisano tutaj [ gnu.org/software/bash/manual/html_node/Command-Grouping.html]
loa_in_

Odpowiedzi:

37

To znak powrotu w kopiowanym tekście powoduje automatyczne wykonanie.

Weźmy inny przykład, skopiuj te linie naraz i wklej je do terminala:

echo "Hello";
echo "World";

Jeśli spojrzysz na swój terminal, nie zobaczysz tego:

$ echo "Hello";
echo "World";

Widać to (może być również powiedzenie linii World):

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

Zamiast czekać na wklejenie wszystkich danych wejściowych, wykonywany jest pierwszy wiersz (i z tego samego powodu drugi wiersz może, ale nie musi). Jest tak, ponieważ RETURNmiędzy dwiema liniami jest znak.

Kiedy naciskasz ENTERklawisz na klawiaturze, wszystko, co robisz, to wysyłanie znaku o wartości ASCII 13. Ta postać jest natychmiast wykrywana przez twój terminal i wie, że ma specjalne instrukcje, aby wykonać to, co wpisałeś do tej pory.

Gdy jest przechowywany na komputerze lub drukowany na ekranie, RETURNznak jest jak każda inna litera alfabetu, cyfry lub symbolu. Znak ten można usunąć za pomocą backspace lub skopiować do schowka, tak jak każdy inny zwykły znak.

Jedyna różnica polega na tym, że gdy przeglądarka widzi znak, wie, że zamiast drukować widoczny znak, powinien traktować go inaczej i ma specjalne instrukcje, aby przenieść następny zestaw tekstu do następnego wiersza. Z tego RETURNpowodu znak i SPACEznak (ascii 32) oraz kilka innych rzadko używanych znaków są znane jako „znaki niedrukowalne”.

Czasami podczas kopiowania tekstu ze strony internetowej trudno jest skopiować tylko tekst, a nie zwrot na końcu (i często utrudnia to styl na stronie).


Czas na eksperyment!

Poniżej znajdziesz dwa polecenia, które zilustrują problem, i na których możesz „ćwiczyć”. Rozpocznij kursor tuż przed echoi przeciągnij, aż wyróżnienie znajdzie się tuż przed strzałką:

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

A teraz spróbuj drugiego polecenia. Rozpocznij kursor tuż przed echoi przeciągnij w dół, aż kursor znajdzie się w drugiej linii, ale znajdzie się tuż przed <-strzałką. Skopiuj go, a następnie wklej do terminala:

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

W zależności od przeglądarki może nie być nawet widoczne, że wybrany tekst przekroczył dwie linie. Ale kiedy wkleisz go do terminala, przekonasz się, że wykonuje wiersz, ponieważ znalazł RETURNznak w skopiowanym tekście.

IQAndreas
źródło
5
Aby zmniejszyć złożoność, całkowicie zignorowałem wspomnienie, że Windows używa dwóch różnych kluczy do zwrotów. Po prostu wiedz, że jest to codzienna nieszczęście i walka, z którą musimy sobie poradzić.
IQAndreas
space jest postacią drukowaną
mikeserv
1
Być może. Jednak gdy testuję pastę z Firefoksa w powłoce (ze stty ustawionym na „raw”), linie kończą się nowymi liniami - nie znak powrotu karetki.
Thomas Dickey,
1
Nie musisz przechodzić do następnego wiersza, jeśli wybierzesz i przejdziesz obok średnika wystarczającą ilość (2-3 znaki), wybierze cały wiersz, co oznacza, że ​​złapałeś się na nowej linii.
@ThomasDickey Czy korzystasz z systemu Windows lub systemu uniksowego?
IQAndreas
10

Jeśli wybierzesz tekst, jeśli na końcu wiersza pojawi się (niewidoczny) znak nowej linii, będzie on wklejany. Jest to spójne we wszystkich emulatorach terminali, które znam. Nowa linia robi to, co nazywacie „sprawdzaniem poprawności”.

W niektórych systemach (takich jak te wykorzystujące terminale synchroniczne, takie jak IBM 3270), Enterklucz „sprawdzałby” ekran, kopiując wszystkie zmiany na hoście.

Thomas Dickey
źródło
2

Co powoduje takie zachowanie?

Znak nowej linii.

PSkocik
źródło