Warum gibt Terminal meinen Befehl nach dem Einfügen von Text automatisch ein?

9

Dies geschieht unabhängig davon, ob ich Strg + Umschalt + V verwende oder aus dem Kontextmenü einfüge.

Wie kann ich dieses Verhalten beenden?

Verlorene Seele
quelle
Weitere Erklärung erforderlich, um Ihre Frage zu verstehen
SHW
Vielleicht macht ConEmu unter Windows das, was Sie wollen - wenn Sie versuchen, etwas einzufügen, das Zeilenumbrüche enthält, werden Sie gewarnt, bevor Sie fortfahren. Es ist eine nette Geste. Vielleicht gibt es einen Linux-Terminalemulator mit dieser Funktion?
Brandin
4
Ich wette, Sie kopieren das nachfolgende "\ n" (Zeilenumbruchzeichen, das Sie in Ihrem Text nicht sehen, aber es ist vorhanden, wenn Sie einen Zeilenumbruch haben), wenn Sie Ihren Text kopieren, wodurch ein Druck auf die EINGABETASTE emuliert wird und somit die Befehl.
Herbert
Mögliches Duplikat davon - unix.stackexchange.com/questions/202732/… Ich wusste nichts über die in dieser Frage erwähnte " Klammerpaste ". Normalerweise verwende ich einen Texteditor in Kombination mit dem Terminal und kopiere dann die gewünschten Teile sorgfältig in das Terminal.
Brandin

Antworten:

6

Kopieren Sie nicht mehrere Textzeilen, um sie einzufügen. Ich kann fast garantieren, dass Sie einfach den letzten Teil der Zeile kopieren. Wenn Sie dreimal klicken, um die eingefügte Codezeile zu kopieren, wird die neue Zeile am Ende der Zeile angezeigt. Wenn Sie sicher sein möchten, dass dies wirklich das Problem ist, kopieren Sie die gesamte Zeile mit Ausnahme des letzten Buchstabens / der letzten Ziffer und prüfen Sie, ob das Einfügen auch eine neue Zeile enthält.

WormFood
quelle
Dies geschah nur, wenn ich mehrere Codezeilen kopierte. Jetzt verstehe ich warum.
Lostsoul
7

Der Text, den Sie einfügen, enthält einen nachgestellten Zeilenumbruch. Wenn Sie eine neue Zeile einfügen, wird dies von der im Terminal ausgeführten Shell als drückend angesehen Enter, sodass der Befehl ausgeführt wird.

Der Einfügevorgang wird vom Terminalemulator ausgeführt. Der eingefügte Text wird auf dieselbe Weise an die Anwendung übergeben, die im Terminal ausgeführt wird, wie der vom Benutzer eingegebene Text. Siehe Wie funktionieren Tastatureingabe und Textausgabe? Weitere Informationen zur Funktionsweise der Eingabe. Die Anwendung (hier die Shell) kann nicht zwischen Tastenanschlägen und einem Einfügevorgang unterscheiden.

Viele Terminalemulatoren unterstützen heutzutage Paste in Klammern . In klammert Paste - Modus die Anwendung kann eine Einfügeoperation von Tastatureingaben unterscheiden. Das Einfügen in Klammern ist nur dann nützlich, wenn die Anwendung mit eingefügtem Text etwas anderes macht. Sie wird also durch die Unterstützung von Anwendungen aktiviert und nicht vom Benutzer des Terminalemulators konfiguriert.

Zsh 5.1 (das vor einigen Wochen veröffentlicht wurde und daher in den meisten Distributionen noch nicht verfügbar ist) bietet Unterstützung für den Einfügemodus in Klammern. Wenn Sie Text einfügen, wird dieser nur in die Befehlszeile eingefügt und Sie können ihn bearbeiten, bevor Sie auf drücken Enter, um die Befehlszeile auszuführen.

Benutzer von oh-my-zsh können das Safe-Paste-Plugin auch in früheren Versionen von zsh verwenden.

Eine andere Sache, die Sie in zsh tun können, ist, die Auswahl als Zeichenfolge mit Anführungszeichen einzufügen (in Form von Backslashes vor jedem Shell-Sonderzeichen wie Leerzeichen). Geben Sie ein `xsel`, um die primäre Auswahl (automatische Mausauswahl) oder `xsel -b`den Inhalt der Zwischenablage (mit Ctrl+ kopierter Text) abzurufen C, und drücken Sie dann Tab.

Wenn Sie eine ältere zsh-Version haben und den Inhalt der Zwischenablage ohne Anführungszeichen einfügen möchten, können Sie eine Funktion definieren, die die Auswahl einfügt.

function zle_insert_x_selection {
  LBUFFER+=$(xsel ${NUMERIC+-b} -o </dev/null)
}
zle -N zle_insert_x_selection
bindkey '\e\C-v' zle_insert_x_selection

Mit dieser Option .zshrckönnen Sie Ctrl+ Alt+ drücken V, um die primäre Auswahl einzufügen, oder Ctrl+ U Ctrl+ Alt+ V, um den Inhalt der Zwischenablage einzufügen. Sie werden unverändert vor dem Cursor eingefügt, außer ohne nachgestellte Zeilenumbruch. Weitere Informationen zu Bash finden Sie unter Freigeben der Zwischenablage zwischen Bash und X11 .

Gilles 'SO - hör auf böse zu sein'
quelle
7

Wenn Sie bash als Shell verwenden, können Sie drücken Ctrl-X Ctrl-E, um einen Editor aufzurufen (definiert durch $ VISUAL oder $ EDITOR, z . B. vioder vielleicht nano).

Sie können dann Ihre Befehle genau so einfügen, als würden Sie eine Datei bearbeiten. Sie werden ausgeführt, wenn Sie speichern und beenden. Oder abgebrochen, wenn Sie ohne Speichern beenden.

cas
quelle
Diese Methode funktioniert bei mir nicht.
LostSoul
3

Um ein mehrzeiliges Einfügen in eine Eingabeaufforderung durchzuführen, öffnen Sie vor dem Einfügen einfache oder doppelte Anführungszeichen.

$ echo 'paste
...
... '

Dann können Sie die Eingabetaste drücken, um das Echo wiederzugeben. Wenn Sie mit dem Pfeil nach oben fahren, befinden sich alle Zeilen, die Sie eingefügt haben, in einer bearbeitbaren Zeile.

Dies funktioniert, solange der eingefügte Text kein einziges Anführungszeichen enthält.

Peter Cordes
quelle
1

Verwenden Sie in einem Texteditorfenster die folgenden Verknüpfungen, um Text ohne \ n (Zeilenvorschub) zu kopieren:

  • Shift+ Home, Ctrl+ Insert- kopiert einen Teil der Zeile vor dem Cursor.
  • Shift+ End, Ctrl+ Insert- kopiert einen Teil der Zeile nach dem Cursor.
  • Home, Shift+ End, Ctrl+ Insert- kopiert die gesamte Zeile ohne \ n.

Verwenden Sie in einem Browserfenster oder einer anderen Sache, in der der Text nicht bearbeitet werden kann, eine von zwei Techniken:

  • Kopieren Sie zuerst in einen Texteditor (bevorzugt, da Sie die Möglichkeit haben, Befehle zu bearbeiten).
  • Wählen Sie nur den Text in der Zeile aus (ohne die Auswahlzone nach rechts über das letzte Zeichen hinaus zu erweitern), dann Ctrl+ Insertund fügen Sie sie in ein Terminalfenster ein.

Wie eine richtige Auswahl (ohne \ n) aussieht:

ls -al

Wie eine falsche Auswahl (mit \ n) aussieht:

ls -al
Incnis Mrsi
quelle