Was führt dazu, dass ein Copy / Paste im Terminal manchmal den Befehl ausführt?

24

Wenn Sie einen Befehl in das Terminal einfügen, wird er manchmal automatisch ausgeführt (genau wie wenn die Eingabetaste gedrückt wurde), manchmal nicht.

Ich benutze Linux seit Ewigkeiten, habe Tausende von Befehlen in verschiedenen Konsolen auf vielen Distributionen eingefügt und kann immer noch nicht sagen, ob der Befehl, den ich einfügen möchte, automatisch ausgeführt wird oder nicht.

Was löst dieses Verhalten aus?

kursus
quelle
5
Wenn Sie sich darüber keine Gedanken machen möchten, geben Sie { vor dem Einfügen (mit Leerzeichen) ein und beenden Sie die Eingabe mit }. Es hat keine Auswirkung auf die Funktionsweise von eingefügten Befehlen, verhindert jedoch, dass die Shell es ausführt, bis Sie den Block schließen. Beschrieben hier [ gnu.org/software/bash/manual/html_node/Command-Grouping.html]
loa_in_ 27.10.15

Antworten:

37

Es ist das Rückkehrzeichen in dem zu kopierenden Text, das die automatische Ausführung auslöst.

Nehmen wir ein anderes Beispiel, kopieren Sie diese Zeilen auf einmal und fügen Sie sie in Ihr Terminal ein:

echo "Hello";
echo "World";

Wenn Sie in Ihr Terminal schauen, sehen Sie Folgendes nicht:

$ echo "Hello";
echo "World";

Sie werden dies sehen (es kann auch eine Zeile mit der Aufschrift sein World):

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

Anstatt darauf zu warten, dass alle Eingaben eingefügt werden, wird die erste Zeile ausgeführt (und aus dem gleichen Grund kann die zweite Zeile dies auch tun oder nicht). Dies liegt daran, dass RETURNsich zwischen den beiden Zeilen ein Zeichen befindet.

Wenn Sie die ENTERTaste auf Ihrer Tastatur drücken , senden Sie nur das Zeichen mit dem ASCII-Wert von 13. Dieses Zeichen wird sofort von Ihrem Terminal erkannt und verfügt über spezielle Anweisungen, um das auszuführen, was Sie bisher eingegeben haben.

Wenn das RETURNZeichen auf Ihrem Computer gespeichert oder auf Ihrem Bildschirm gedruckt wird, entspricht es genau einem anderen Buchstaben des Alphabets, der Zahl oder des Symbols. Dieses Zeichen kann mit der Rücktaste gelöscht oder wie jedes andere reguläre Zeichen in die Zwischenablage kopiert werden.

Der einzige Unterschied besteht darin, dass Ihr Browser erkennt, dass ein sichtbares Zeichen nicht gedruckt , sondern anders behandelt werden muss, und dass er spezielle Anweisungen zum Verschieben des nächsten Textsatzes in die nächste Zeile enthält. Aus diesem Grund werden das RETURNZeichen und das SPACEZeichen (ASCII 32) zusammen mit einigen wenigen anderen selten verwendeten Zeichen als "nicht druckbare Zeichen" bezeichnet.

Wenn Sie Text von einer Website kopieren, ist es manchmal schwierig, nur den Text und nicht den Zeilenumbruch am Ende zu kopieren (und dies wird häufig durch die Gestaltung der Seite erschwert).


Versuchszeit!

Im Folgenden finden Sie zwei Befehle, die das Problem veranschaulichen und mit denen Sie "üben" können. Starten Sie Ihren Cursor direkt vor echound ziehen Sie, bis sich die Markierung direkt vor dem Pfeil befindet:

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

Und jetzt versuchen Sie den zweiten Befehl. Starten Sie Ihren Cursor direkt vor echound ziehen Sie ihn nach unten, bis sich der Cursor in der zweiten Zeile befindet, sich jedoch direkt vor dem <-Pfeil befindet. Kopieren Sie es und fügen Sie es in Ihr Terminal ein:

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

Abhängig von Ihrem Browser kann es sein, dass der ausgewählte Text nicht mehr als zwei Zeilen lang ist. Aber wenn Sie es in das Terminal einfügen, werden Sie feststellen, dass es die Zeile ausführt, weil es ein gefunden hatRETURN Zeichen im kopierten Text gefunden hat.

IQAndreas
quelle
5
Um die Komplexität zu verringern, habe ich es völlig ignoriert zu erwähnen, dass Windows zwei verschiedene Schlüssel für Retouren verwendet. Wisst einfach, dass es ein tägliches Leid und ein Kampf ist, mit dem wir uns befassen müssen.
IQAndreas
space ist ein druckendes
zeichen
1
Vielleicht. Wenn ich jedoch eine Paste aus Firefox in eine Shell teste (wobei stty auf "raw" gesetzt ist), enden die Zeilen mit Zeilenumbrüchen - nicht mit einem Wagenrücklauf.
Thomas Dickey
1
Sie müssen nicht in die nächste Zeile wechseln. Wenn Sie das Semikolon in ausreichender Anzahl (2-3 Zeichen) auswählen und über dieses hinausgehen, wird die gesamte Zeile ausgewählt, was bedeutet, dass Sie sich eine neue Zeile eingefangen haben.
@ThomasDickey Sind Sie unter Windows oder auf einem Unix-basierten System?
IQAndreas
10

Wenn Sie Text auswählen und die (unsichtbare) neue Zeile am Ende einer Zeile einfügen, wird sie in den eingefügten Text eingefügt. Dies gilt für alle mir bekannten Terminalemulatoren. Die Newline macht das, was Sie "validieren" nennen.

Auf einigen Systemen (z. B. solchen, die synchrone Terminals wie IBM 3270 verwenden) Enter"validierte" der Schlüssel den Bildschirm, indem er alle Änderungen auf den Host kopierte.

Thomas Dickey
quelle
2

Was löst dieses Verhalten aus?

Das Newline-Zeichen.

PSkocik
quelle