Terminal - Kopieren von CLI ohne Maus

20

Beim Auslösen von Befehlen in CLI möchte ich den Befehl, den ich gerade ausgelöst habe, oder alles, was ich im Terminal geschrieben habe , kopieren und an einer anderen Stelle einfügen, ohne die Maus zu verwenden.

Wie im folgenden Bild möchte ich den Update-Befehl (ganz oder teilweise) kopieren, ohne die Maus zu verwenden, und ihn irgendwo einfügen.

Kopieren von CLI ohne Verwendung der Maus

Gebet
quelle
1
Du benutzt Gnome ohne Maus?
ott--

Antworten:

11

Sie können verwenden screen(1) in Ihrem Terminal - Emulator der Wahl ( xterm, gnome-terminal, ...).

Die Funktionalität, die Sie benötigen, ist integriert screen. Sie müssen sich mit der Funktionsweise vertraut machen:

  • Standardmäßig lautet die Tastenkombination "Befehl" " Ctrl+" A. Sie erstellen Befehle, indem Sie die Sequenz "Befehl" und die entsprechende Aktion eingeben.
  • Der Befehl "Kopieren" lautet: AltGr+[
  • Der Befehl "Einfügen" lautet AltGr+]

Sie können den Befehl "kopieren" und in ein anderes Terminal "einfügen".

screen macht Spaß und sobald Sie anfangen es zu benutzen, werden Sie sich fragen, wie es möglich ist, dass Sie es überhaupt nicht benutzt haben.

Dawud
quelle
Da es keinen screenBefehl gab, habe ich ihn in gnome-terminal installiert und screenin einem Terminal gestartet . Konnte danach aber nicht mehr loslegen. Ich habe auch nicht verstanden, was Sie mit eingebautem Bildschirm meinen.
Prayagupd
1
Lesen man screen. Auch schrieb ich ‚Built-in im Bildschirm‘, was bedeutet , das Kopieren / Einfügen - Funktionalität in ist screen durch Design .
Dawud
Sie müssen die spaceTaste verwenden, um den gewünschten Bereich auszuwählen. Sie müssen verwenden, Yum die gesamte Zeile oder den gewünschten Bereich zu kopieren. Bildschirm ist vibewegungsfreundlich.
FelikZ,
Was ist der AltGrSchlüssel? Ich habeAlt
alhelal
1
Das screenTool funktioniert nicht hat hier erklärt. Und es scheint keine Antwort auf die Frage zu geben.
Luís de Sousa
7

Zusätzlich zu den bereits bereitgestellten Antworten können Sie einen Umstieg auf einen flexibleren Terminalemulator in Betracht ziehen.

Wenn Sie bereit wären, Terminals in rxvt- unicode zu ändern , könnten Sie ein Tool wie urxvt-perls verwenden : eine Sammlung von Skripten, die die folgenden Tastaturfunktionen in diesem Terminalemulator bereitstellen:

  • Text auswählen, kopieren und einfügen
  • vorwärts und rückwärts suchen
  • Markieren und öffnen Sie URLs in Ihrem bevorzugten Browser

Sie installieren einfach das Paket und fügen dann ein paar Zeilen zu Ihrem hinzu ~/.Xresources, und Sie können das Nagetier dann endgültig ausstecken.

jasonwryan
quelle
4

Sie können dies mit einem Programm wie dem xclipfolgenden tun :

NAME
   xclip - command line interface to X selections (clip‐
   board)

Sobald Sie es installiert haben, können Sie es verwenden, um eine Verbindung zu Ihrer X-Zwischenablage herzustellen. Leider funktioniert dies in Ihrer mysqlUmgebung nicht (es hat einen eigenen Puffer für kopierte Zeilen), aber es funktioniert, wenn Sie einen "normalen" Befehl ausführen möchten. Beispielsweise :

$ This is a long command line

Geben Sie Folgendes ein CtrlA, um an den Anfang der Zeile zu gelangen, setzen Sie den Befehl in Anführungszeichen und wiederholen Sie ihn:

$ echo -e "This is a long command line" |xclip 

Sie haben jetzt "Dies ist eine lange Befehlszeile" in Ihrer mittleren Klick-Zwischenablage.

Wenn Sie einfügen möchten, ohne eine Maus zu verwenden, hängt es davon ab, wo Sie einfügen. Sie können Folgendes in ein anderes Terminal einfügen:

$ xclip -o

Sie können in dasselbe Terminal einfügen, indem Sie einfach den Befehl mit CtrlKbeenden (ausschneiden) und dann mit einfügen CtrlY.

Sie können Befehle auch über Terminals hinweg speichern, indem Sie den Bash-Verlauf verwenden. Fügen Sie diese Zeile zu Ihrem hinzu ~/.bashrc:

PROMPT_COMMAND='history -a; history -r'

PROMPT_COMMANDist eine spezielle Bash-Variable. Wenn es gesetzt ist, wird der Wert als Befehl ausgeführt, bevor eine neue Eingabeaufforderung ausgegeben wird. history -aschreibt den Verlauf der aktuellen Sitzung in die Verlaufsdatei und history -rlädt diese neu. Dies bedeutet, dass jeder Befehl, den Sie ausführen, sofort in die Verlaufsdatei geschrieben wird.

Wenn Sie nun eine lange Befehlszeile ausführen, können Sie zu einem anderen Terminal wechseln und die Eingabetaste drücken (um $PROMT_COMMANDalternativ ein neues Terminalfenster zu öffnen). Auf dieses Fenster kann dann auf den Verlauf dieses Terminals zugegriffen werden. Wenn Sie jetzt drücken Up, können Sie es auf dem neuen Terminal ausführen.

terdon
quelle
Das ist in Ordnung, aber ich muss immer noch die Maus benutzen?
Gebet
@PrayagUpd Ah ja, das wird in den mittleren Klickpuffer kopiert. Eine andere Möglichkeit finden Sie in der aktualisierten Antwort.
terdon
Ich denke, es $ xclip -oist nicht das, was ich will, weil es nur das druckt, was ich xcliped. Aber +1 für Ctrl+Agefolgt von Ctrl+Kund Ctrl+Yzum Ausschneiden und Einfügen in das mindestens gleiche Terminal.
Gebet
@PrayagUpd die Sache ist, dass es verschiedene Puffer in der Zwischenablage gibt und die Lösung davon abhängt, was genau Sie tun möchten. Könnten Sie Ihre Frage anhand eines konkreten Beispiels aktualisieren? Ich meine Kopieren von wo (MySQL wird schwierig sein) und wohin.
Terdon
1
@ PrayagUpd siehe aktualisierte Antwort für einen anderen Trick.
Terdon
1

@evilsoup hat eine gute Lösung vorgeschlagen, die jedoch häufig abbricht.

Eine schnelle Lösung

Hier ist eine Lösung, die niemals bricht .

history | tail -2 | head -1 | xclip -selection clipboard

Führen Sie einfach diesen Befehl aus, und der soeben ausgeführte Befehl wird in die Zwischenablage kopiert.

Im Grunde bedeutet dies, dass der Befehlsverlauf gedruckt und der vorletzte Befehl in die Zwischenablage übernommen wird (der letzte Befehl ist derselbe, sodass der vorletzte Befehl ausgewählt wird).

Eine benutzerdefinierte Funktion

Hier ist eine kleine Funktion, die ich geschrieben habe. Sie ist ziemlich clever und kopiert den zuletzt verwendeten Befehl. Sie können auch numerische Argumente angeben, um den letzten n-ten Befehl zu kopieren. ZB zum Kopieren des vorletzten Kommandos 2als Argument angeben

myclipcopy () {

  if [ -z $1 ]
    then  # if no argument was provided then just copy the last used command
    history | tail -2 | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo 'Anyways, the following command has been copied:'
    history | tail -2 | head -1| sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'

  else
    myindex=$(( $1+1 ))
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo "The following command has been copied:"
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'
  fi

  #Delete this command itself from the history
  myhisnum=$(history | tail -1 | grep -oP '\s\d+\s' | grep -oP '\d+'); history -d $myhisnum
}

Kopieren Sie die obige Funktion und fügen Sie sie in Ihre ~/.bashrcDatei ein. Beachten Sie, dass, wenn Sie dies in eine separate Bash-Skriptdatei einfügen und das Skript ausführen, dies nicht funktioniert, da der Befehl history in diesem Fall nicht auf Ihren Verlauf zugreifen kann.

Führen Sie es schließlich aus als:

myclipcopy 3
# This copies the third-last command

Darüber hinaus ist eine coole Eigenschaft, die zu dieser Funktion hinzugefügt wurde, dass sie sich selbst aus dem Verlauf löscht, nachdem sie ausgeführt wurde. Dies ist hilfreich, da sich dann der "Rückwärts" -Index der Befehle nicht ändert.

shivams
quelle
Das ist nicht robust .
mikeserv
@mikeserv: Ich habe es jetzt in "Custom Function" umbenannt. Aber warum hast du es abgelehnt? Merken Sie nicht, dass dies die Frage richtig beantwortet? Außerdem sagte ich "robust", weil es eigentlich nie brechen sollte. Indem Sie abstimmen, verstecken Sie nur eine entsprechende Antwort aus dem Beitrag.
Shivams
Ich habe downvoted, weil Sie viel davon ausgehen, insbesondere Bash und Linux, von denen in der Frage keines angegeben ist. Auch Ihre Pipeline ist lächerlich überkompliziert, und das gleiche gilt für Ihre Regex
MikeServ
@mikeserv: Danke für den Kommentar. Hoffentlich hilft mir das, bessere Antworten zu finden. Ich werde akzeptieren, dass meine Regex und Pipelines hässlich sind. Aber sie sind gut getestet und ich habe es benutzt. Und was die Annahmen angeht, haben Sie bemerkt, dass bei der Antwort mit der höchsten Bewertung die Annahme getroffen wurde, dass der Benutzer sie verwendet screen. Die zweithöchste Antwort hatte ebenfalls bashund angenommen linux. Darüber hinaus ist die Annahme bashkeine große Sache, da das Skript in zsh oder den meisten anderen Shells noch funktionieren würde.
Shivams
Ich habe nicht gesagt, dass es hässlich ist - ich habe gesagt, dass es zu kompliziert ist. Und nein, es wird in den meisten anderen Shells nicht gut funktionieren . Und was mehr ist, die CLI tatsächlich in der Frage im Bild ist MySQL. Guter Punkt zu den anderen Antworten.
mikeserv
0

Dieser Befehl verwendet die History-Erweiterung von bash ( !!erweitert sich also in die letzte Zeile, die Sie in das Terminal eingegeben haben). Sie müssen wahrscheinlich entweder xclipoder installieren xsel.

echo "!!" | xclip -selection clipboard

echo "!!" | xsel -i --clipboard

Dies wird Ihren letzten Befehl in dem setzen Ctrl+ vZwischenablage, so Sie in der Lage sein werden , in jedes GUI - Programm einzufügen in (oder mit Ctrl+ Shift+ vin den meisten Terminal - Emulatoren, oder mit "+pin vim).

Dies wird für einige Zeilen, die doppelte Anführungszeichen enthalten, unterbrochen, zum Beispiel:

$ echo "foo;bar"
foo;bar
$ echo "!!"
echo "echo "foo;bar""
echo foo
The program 'bar' is currently not installed. You can install it by typing:
sudo apt-get install bar

Dies funktioniert jedoch für den Befehl, den Sie als Beispiel angegeben haben. Sie sollten nur dann Probleme haben, wenn die doppelten Anführungszeichen ausgeblendet werden ; & && | ||und so weiter.

Übelsuppe
quelle
Vielen Dank für diese Antwort, dies war die praktischste Lösung, die ich sofort implementieren konnte. Und ich glaube , die Probleme mit "einfach vermieden werden können , indem nicht !! gar zu zitieren, nur tun , echo !!und es wird funktionieren einwandfrei (außer im unwahrscheinlichen Fall , dass Ihr vorheriger Befehl begann mit -noder -eoder den wenigen anderen Optionen , die echoich nimmt).
Sundar - Wiedereinsetzung von Monica
0

Vielleicht nicht die bequemste Lösung, aber ich benutze sie und sie kann daher für andere hilfreich sein, da keine zusätzliche Soft-Installation erforderlich ist.

  1. Sie müssen eine temporäre Datei in einem beliebigen Verzeichnis erstellen

  2. Übertragen Sie die gewünschte Richtung oder den gewünschten Text in diese Datei. Zur Richtungsübertragung können Sie verwenden

    echo $(pwd) 1> tempo
    
  3. Verwenden Sie den Befehl, um die Richtung aus der Datei abzurufen

    cd $(tail -n 1 tempo)
    

Zum Kopieren und Einfügen von Befehlen funktioniert dieses System natürlich. Hoffe das war hilfreich

Dmitriy Kormulev
quelle
Kusalananda danke für die Bearbeitung. Jetzt sieht die Antwort viel besser aus
Dmitriy Kormulev