Deaktivieren Sie das Standardverhalten zum Kopieren und Einfügen in Bash

9

Wenn ich in meine Terminalsitzung einfüge, führt die Shell den Befehl sofort aus, ohne dass ich die Eingabetaste drücke.

Ich weiß wirklich nicht, wie ich dieses Verhalten deaktivieren soll.

Ich verwende das vorinstallierte Terminal unter MacOS Yosemite.

Opaldes
quelle
9
Dies ist natürlich nur möglich, wenn der Einfügepuffer eine neue Zeile enthält. Das hat (fast) nichts mit Bash zu tun. (Es handelt sich nur um Bash, wenn und soweit es die Readline-Bibliothek verwendet.)
Peter - Reinstate Monica
... und doch bash(mit Hilfe von readline) hat eine Lösung.
Alexis

Antworten:

16

Mit bash4.4 oder neuer und in Terminals, die das Einfügen in Klammern unterstützen xterm, können Sie Folgendes tun:

bind 'set enable-bracketed-paste'

(oder set enable-bracketed-pastezu Ihrem hinzufügen ~/.inputrc)

Das bewirkt , dass die Copy-Paste - Puffer darin an der Eingabeaufforderung anstelle der Zeichen eingefügt werden , wie zu interpretieren , wenn getippt (Sie immer noch Probleme haben könnten , wenn dieser Puffer enthalten Zeichen wie ^C, ^Zund Terminal - Emulator ist sie nicht ausfiltern) .

zsh macht das standardmäßig seit Version 5.1.

Weitere Shells oder Terminals finden Sie auch unter: Wie kann ich mich vor dieser Art von Missbrauch in der Zwischenablage schützen?

Stéphane Chazelas
quelle
Ich werde gleich darauf
eingehen
Stand Wege scheint nicht zu funktionieren
Opaldes
@Opaldes, was hast du versucht? Mit welcher Version von welcher Shell und auf welchen Terminals? Ich glaube, OS / X wird auch mit ausgeliefert xterm, das können Sie stattdessen versuchen. Haben Sie das perlSkript bei der verknüpften Frage ausprobiert ?
Stéphane Chazelas
1
@Opaldes, gemäß dem Einfügen von Code in das Terminalfenster in vim unter Mac OS X OS / X Terminal unterstützt das Einfügen in Klammern seit OS / X Lion. Es scheint also, dass Sie nur eine ausreichend aktuelle Version von zsh oder bash benötigen. Bei älteren zsh-Versionen kann dies auch über die Konfiguration erreicht werden.
Stéphane Chazelas
1
Wir können Daniel Colascione dafür danken, dass er Bash / Readline diese nützliche Funktion hinzugefügt hat: gnu-bash.2382.n7.nabble.com/…
Anthony Geoghegan
6

Dies geschieht, wenn Sie ein "Zeilenumbruch" -Zeichen einfügen. Wenn Sie beispielsweise mehrere Zeilen einfügen oder auf unbekannte Weise einen Wagenrücklauf am Ende der Zeile kopieren. AFAIK Es gibt keine Möglichkeit, dieses Verhalten tatsächlich zu deaktivieren, aber es gibt Möglichkeiten, es zu mildern.

Am einfachsten ist es, jeweils nur eine Zeile zu kopieren und das letzte Zeichen zu verpassen, um es anschließend manuell hinzuzufügen.

Wie the_velour_fog weiter unten ausführt, können Sie es auch in einen Editor einfügen, der nicht gedruckte Zeichen anzeigt, und ohne die neue Zeile erneut auswählen.

Es gibt ein oder zwei Problemumgehungen für GNU / Linux-Distributionen, aber keine Ahnung, ob das Konzept auf MacOS portiert werden könnte. Schauen Sie sich hier an, ob es eine ähnliche Datei auf dem Mac gibt, die Sie ändern können. Leider bezweifle ich es.

I_GNU_it_all_along
quelle
Ich füge es einfach in einen Editor ein, der nicht gedruckte Zeichen anzeigt,
wähle es
Guter Vorschlag, bearbeitet, um einzuschließen.
I_GNU_it_all_along
Gut zu wissen, dass dies nicht immer passiert. Ich habe Ihre Antwort positiv bewertet, aber es ist eher eine Problemumgehung als Lösung für mich.
Opaldes
Es ist schmerzhaft, kann aber beim Kopieren einer Reihe von Befehlen hilfreich sein.
I_GNU_it_all_along
Meine "Lösung" ist auch eine Art Hack-Workaround, aber sie ist schneller als die separate Auswahl von IMO.
Peter Cordes
5

Geben Sie vor dem Einfügen ein einfaches Anführungszeichen ein und fügen Sie es ein. Strg-C und Aufwärtspfeil, um es als eine riesige Linie zu bearbeiten.

doppelte Anführungszeichen funktionieren auch, wenn der Text einfache, aber keine doppelten Anführungszeichen enthält. Es ist in Ordnung, wenn es $oder andere Dinge enthält , die in doppelten Anführungszeichen erweitert werden, da Sie die zitierte Riesenzeile nicht als einen Befehl ausführen.


Sie können das Ganze nicht direkt dort bearbeiten, da Zeilenumbrüche eine Fortsetzungsaufforderung (nicht die offizielle Terminologie) starten, anstatt eine große lange Zeile zu erstellen.

gegeben diese 4 Zeilen:

echo
ls
foo
bar

Das Einfügen, wie ich vorschlage, führt dazu, dass dies auf Ihrem Bildschirm angezeigt wird:

$ 'echo 
> ls
> foo
> bar        <or cursor here if you didn't include a trailing newline
> [cursor here]

Sie können dann Strg-C und Aufwärtspfeil drücken. (Strg-C zerstört alles in derselben Zeile wie der Cursor. Drücken Sie also zuerst die Eingabetaste, wenn dort nützlicher Text vorhanden ist.)

Eine Alternative besteht darin, das Angebot zu schließen und die Eingabetaste zu drücken und dann den Aufwärtspfeil zu drücken.

Wie auch immer, nach dem Aufwärtspfeil

$ 'echo
ls
foo
bar

Control-A und entfernen Sie die Führung '. Verwenden Sie Strg-Links und Strg-Rechts, um sich schnell (mit Worten) durch den Einfügeblock zu bewegen. Oder wenn Ihr Terminal-Setup keine Steuerpfeiltasten, Alt-B und Alt-F unterstützt.


Die wörtlichen Zeilenumbrüche trennen tatsächlich Befehle, und diese 4 Zeilen werden separat in Ihren Befehlsverlauf aufgenommen . Vielleicht möchten Sie sie in ;oder ändern &&. (Ich kenne keinen Trick dafür. Verwenden Sie einfach die Tastenwiederholung für Vorwärts- oder Rückwärtswort, um schnell dorthin zu gelangen und dies manuell zu tun.)

Peter Cordes
quelle
2

Dies geschieht, weil Ihre Einfügung mit einer neuen Zeile endet und Terminalemulatoren die Einfügung grundsätzlich zeichenweise Bash zuführen. In diesem Prozess kennt bash die menschliche Schreibkraft nicht wirklich von einer Maschine.

Normalerweise achte ich beim Einfügen nur darauf, dass es keine neue Zeile enthält, aber es gibt einen Trick, den Sie ausprobieren können: Geben Sie vor dem Einfügen in Bash ein C-x C-e. Es sollte $EDITORmit einer leeren Datei gestartet werden. Was auch immer Sie in dieser Datei speichern und beenden, Bash wird ausgeführt. So können Sie jetzt Ihren Befehl in den Editor einfügen, möglicherweise die Dinge weiter bearbeiten und sie dann alle auf einmal ausführen.

nperson325681
quelle
-1

Ich bin NICHT mit dem Unternehmen verbunden, ich bin ein sehr zufriedener Kunde. Probieren Sie dieses Terminalprogramm aus: http://www.emtec.com/zoc/index.html . Es gibt auch eine Mac-Version.

Wenn ich mit dieser Antwort gegen eine SE-Regel verstoße, lass es mich wissen und ich lösche die Antwort.

Bearbeiten:

Wenn ich die anderen Antworten richtig verstanden habe, kann dieses Problem durch das Terminalprogramm verursacht werden. Das ZOC-Terminalprogramm ist eine professionelle Software, die perfekt für die Arbeit entwickelt wurde. Der ausgewählte Text wird ohne zusätzliches Zeichen eingefügt. Sie können Ihre Sitzungen in einer separaten Textdatei protokollieren. Und vieles mehr

Aktualisieren:

Das Terminalprogramm hat eine Option Paste without final 'newline'. Vielleicht hilft das.

Al Bundy
quelle
3
Bitte sagen Sie zumindest, wie es die Frage beantwortet
Stéphane Chazelas
Was passiert, wenn Sie an der Eingabeaufforderung einer in diesem Terminal ausgeführten Shell eine Zeichenfolge einfügen, die Zeilenumbrüche oder Zeilenumbrüche enthält? Wie funktioniert die Shell, wenn sie die Befehle nicht sofort ausführt (wie hier gefragt)? Entfernt es diese Zeichen aus der Auswahl? Fügt es vorher ein ^ V-Zeichen ein, um es für Bash zu maskieren?
Stéphane Chazelas
2
Als solches sieht es eher nach Spam aus (obwohl ich sicher war, dass Sie diese Website nicht als Spam versenden wollten). Es beantwortet die Frage nicht und ist nur Werbung für ein verwandtes kommerzielles Produkt.
Stéphane Chazelas
2
@AlBundy, finden Sie heraus, ob Ihr bevorzugter Terminal-Client dieses Problem löst, indem Sie die in security.stackexchange.com/q/39118 (in Stephanes Antwort erwähnt) beschriebenen Exploits und die dort enthaltenen Links ausprobieren . Wenn es Sie schützt, haben Sie gute Gründe, es zu empfehlen (geben Sie die Details Ihrer Tests in Ihrer Antwort an.).
Alexis
Normalerweise ist das Problem , dass Sie ausgewählt , was tut eine neue Zeile enthalten. Wie unterscheidet sich "Einfügen des ausgewählten Textes" vom normalen Verhalten eines anderen Terminalemulators?
Peter Cordes