Verhindern Sie mehrzeiliges Einfügen in Bash

10

Ich ctrl+ckopiere oft Text aus einer GUI-Anwendung und füge ihn dann mit dem Rechtsklick-Menü in meinen Terminal-Emulator (Terminator) ein und füge ihn ein. Manchmal vergesse ich, dass die Zwischenablage mehrere Zeilen enthält, was beim Einfügen in bash dazu führt, dass jede Zeile "ausgeführt" wird.

Gibt es eine Lösung, um mehrzeiliges Einfügen vollständig zu verhindern?

Martin Vegter
quelle
Fügen Sie
1
Führen Sie in bash den Befehl aus sleep 999999und fügen Sie ihn ein, wenn er in Ordnung aussieht. Der Befehl sleep liest die Zeilen nicht und sie werden verworfen, wenn Sie drücken ctrl+c.
Skaperen
2
Relevant: security.stackexchange.com/q/39118
Stéphane Chazelas
1
@Otheus aktiviert printf '\e[?2004h'in den meisten xterm-ähnlichen Terminalemulatoren einen Einfügemodus in Klammern, in dem das Terminal den eingefügten Text in Klammern setzt, sodass Anwendungen erkennen können, wo das Einfügen beginnt und wo es endet. xterm unterstützt auch einen anderen Modus, in \e[?2005hdem allen eingefügten Zeichen ein Präfix vorangestellt wird ^V(von vielen Anwendungen und der Disziplin tty line als verstanden litteral-next).
Stéphane Chazelas

Antworten:

5

Diese Antwort ist nicht die spezifischste für die Frage des Benutzers. Siehe meine 2. Antwort. Ich lasse dies hier, weil es das allgemeinere Problem anspricht .

Per Kommentare zu Ihrem ursprünglichen Post, müssen Sie (1) einen Terminal - Emulator , den Träger klammern Paste und (2) entsprechende Unterstützung für das, was im Terminal läuft, dh vim, bash, zsh. Terminalemulatoren, die das Einfügen in Klammern unterstützen (Liste, die basierend auf den Kommentaren zu diesem Beitrag aktualisiert werden soll):

  • xterm - schon seit ??
  • gnome-terminal - schon seit ??
  • putty - seit 0.63 (Erscheinungsdatum 06.08.2013)

Anwendungen, die den Klammermodus unterstützen:

  • vim
  • zsh

Für bashStéphaneChazelas wurde ein Shell-Skript zusammengestellt , um die Erkennung dieses Modus zu erleichtern und geeignete Maßnahmen zu ergreifen.

Eine spezifischere Antwort - das Verhindern, dass Zeilen abgeschnitten werden - ist nicht zu beantworten, ohne zu wissen, welches Unix-Programm ausgeführt wird, wenn Sie auf Einfügen klicken.

Ein Zwischenablage-Manager vielleicht das, was Sie brauchen.

Otheus
quelle
Das Skript dort erkennt kein Einfügen in Klammern, es ist ein Perl- Skript, das eine dritte Form von Einfügen in Klammern emuliert, die keine Unterstützung in der Anwendung benötigt, außer dass die Anwendung ^ V als Litteral-Next verstehen muss (dieses Skript würde dies tun) Beantworten Sie diese Frage tatsächlich, obwohl sie wahrscheinlich verbessert werden müsste, es war nur ein PoC).
Stéphane Chazelas
@ StéphaneChazelas zögern Sie nicht, meinen Beitrag zu bearbeiten / zu verbessern. :) "Die Anwendung muss verstehen ^Vals literal-next. Aber wie kommt der ^Vin den Eingabestream der Anwendung?
Otheus
Es wird angezeigt, wenn sich das innere tty-Gerät nicht im icanon-Modus befindet (wie es in bashder Eingabeaufforderung von readline angezeigt wird (und als Literal-next behandelt wird)). Im icanon-Modus wird es von der Zeilendisziplin dieses inneren tty-Geräts entfernt (solange der lnextCharakter vorhanden ist ^V), genau wie wenn Sie Strg-V X manuell
eingeben
1
Wenn Sie dieses Skript nicht verwenden, wird nichts eingefügt, es ^Vsei denn, Sie verwenden den xterm- quoted pasteModus (durch Senden aktiviert \e[?2005h). Dieses perlSkript könnte so angepasst werden, dass es alle bis auf die erste Zeile in einer mehrzeiligen Einfügung entfernt (obwohl dies für große Pasten nicht zuverlässig ist), aber wie es bereits ist, da es die neue Zeile für die Readline zitiert (als hätten Sie Strg- gedrückt). V Strg-J) verhindert, dass die Zeilen ausgeführt werden (sie werden nur zum Bearbeitungspuffer hinzugefügt und Sie müssen noch die Eingabetaste drücken, um sie auszuführen).
Stéphane Chazelas
4
Welche zweite Antwort?
Xiao