Kopieren Sie den letzten Befehl in das Terminal

22

Ich kann den letzten Befehl im Terminal sehen, indem ich up arrowwie im folgenden Beispiel drücke:

Ich tippte cd /:

Makss-Mac:~ maks$ cd /

... gedrückt enter, Befehl cd /ausgeführt und jetzt kann up arrowich den Befehl cd /erneut drücken und sehen :

Makss-Mac:/ maks$ cd /

Ich möchte nicht nur den letzten Befehl sehen, sondern ihn in die Zwischenablage kopieren.

Möglicherweise gibt es eine Verknüpfung, die nicht nur den letzten Befehl im Terminal anzeigt (so up arrowwie), sondern gleichzeitig in die Zwischenablage kopiert.

Oder es gibt eine Abkürzung, um alle aus der aktuellen Terminalleitung auszuwählen. Und so kann ich den letzten Befehl (nach dem Drücken von up arrow) durch Drücken von kopieren super+c. Natürlich kann ich es mit der Maus auswählen. Aber wenn Befehle zehnmal länger sind cd /, kann dies zu zeitaufwändig sein, insbesondere, wenn Sie dies alle 30 Sekunden tun.

Oder vielleicht gibt es eine Möglichkeit, ein Plugin für Terminal zu schreiben

Maxim Yefremov
quelle
Es könnte einfacher sein, hier eine Lösung zu finden, wenn Sie einige Details hinzufügen, was Sie später mit dem Inhalt der Zwischenablage tun möchten. Wohin wirst du es einfügen?
Nohillside
Ja, um es auf einem anderen Terminal-Tab
einzufügen

Antworten:

17

Fügen Sie dies in Ihr ~/.bashrc ~/.bash_profileoder wo immer es Ihnen gefällt ein:

alias copyLastCmd='fc -ln -1 | awk '{$1=$1}1' | pbcopy '

Nach dem Öffnen eines neuen Fensters (oder dem Ausführen source ~/.bash_profile) sollten Sie in der Lage copyLastCmdsein, den Befehl auszuführen und in der Zwischenablage zu haben.

Um zu erklären, was los ist: Sie verwenden im Grunde genommen "fix command" ( fc), um den letzten Befehl zu erhalten, entfernen Sie führende und nachfolgende Leerzeichen, um eine bessere Formatierung zu awkerzielen, und kopieren Sie sie dann mit in das Pasteboard Ihres Mac pbcopy.

BEARBEITEN:

Jetzt, da wir wissen, dass Sie kopieren möchten, um es in einen anderen Terminal-Tab einzufügen, gibt es eine andere Option: Fügen Sie diese Zeilen zu Ihrem ~/.bashrc ~/.bash_profileoder wo immer Sie möchten hinzu :

shopt -s histappend
PROMPT_COMMAND='$PROMPT_COMMAND; history -a; history -n'

Sobald Sie einige neue Registerkarten geöffnet haben (nennen wir sie "Registerkarte A" und "Registerkarte B"):

  1. Führen Sie einen beliebigen Befehl in Tab A aus
  2. Wechseln Sie zu Tab B, drücken Sie die Eingabetaste in einer leeren Zeile und erhalten Sie eine "frische" neue Zeile (und werten Sie so den Verlauf neu aus).
  3. Verwenden Sie den Aufwärtspfeil einmal und Sie sollten den Befehl haben, den Sie gerade in Tab A eingegeben haben.

EDIT 2: Ich habe die Verwendung ersetzt sedmit awkin der ursprünglichen Antwort oben, kümmern sowohl führende und nachfolgende Leerzeichen.

Asmus
quelle
Das ist ein toller Pseudonym! Um die abschließende neue Zeile abzuschneiden, damit Sie den Befehl nach dem Einfügen bearbeiten können, habe ich awkalias copyLastCmd='fc -ln -1 | sed '1s/^[[:space:]]*//' | awk 1 ORS="" | pbcopy '
Folgendes
@nwinkler: OH du hast recht, hätte awk verwenden sollen: Entfernt fc -ln -1 | awk '{$1=$1}1'sowohl abschließende als auch führende Leerzeichen.
Asmus
1
musste den Alias ​​für spezielle Zeichen ändern alias copyLastCmd="fc -ln -1 | awk '{\$1=\$1}1' | pbcopy". bekommt immer noch meine Zustimmung
Mike D
1
Ich habe dies verwendet, bis ich auf einem Terminal ein "git -reset -hard" ausgeführt und in einem anderen "ahnungslosen git-Ordner" den Pfeil nach oben gedrückt und hastig eingegeben habe, als ich dachte, ich würde ein Skript ausführen, das ich zuvor verwendet habe. Sie können sich vorstellen, was passiert ist, und das war das letzte Mal, dass ich diese gemeinsame "globale" Geschichte
nutzte
@MrGigu ist mir mit einer "lokalen" Geschichte passiert, in der ich aus Versehen zweimal auf den "Auf" -Pfeil gedrückt habe - Lektionen, die ich auf die harte Weise gelernt habe, denke ich.
Asmus
5

Hier ist eine weitere Einstellung, die auf der Antwort von @Asmus basiert. Damit sein Alias ​​in meinem Bash-Skript funktioniert, musste ich ein bisschen Anführungszeichen verwenden, da einfache Anführungszeichen in einem Alias ​​mit einfachen Anführungszeichen ohne zusätzliche Anführungszeichen nicht funktionieren:

alias copyLastCmd='fc -ln -1 | awk '\''{$1=$1}1'\'' | pbcopy'

Das '\''schließt im Grunde das aktuelle Angebot, fügt dann ein maskiertes Angebot hinzu und öffnet dann das aktuelle Angebot erneut.

Die obige Version kopiert den letzten Befehl in Ihre Zwischenablage. Sobald Sie ihn einfügen, wird er sofort ausgeführt, da er am Ende eine neue Zeile enthält .

Um den Zeilenvorschub am Ende zu entfernen, damit Sie den Befehl tatsächlich bearbeiten können, bevor Sie ihn ausführen, können Sie Folgendes tun:

alias copyLastCmd='fc -ln -1 | awk '\''{$1=$1}1'\'' ORS='\'''\'' | pbcopy'

Das ORS=''(ohne Anführungszeichen) entfernt das abschließende Zeilenumbruchzeichen, sodass Sie den eingefügten Text bearbeiten können, bevor Sie ihn ausführen.

nwinkler
quelle
5

Hiermit wird die Verlaufserweiterung verwendet , um den letzten Befehl abzurufen und zu wiederholen. Sie können eine Pipe an senden, pbcopyum den letzten Befehl in Ihrer Zwischenablage zu speichern.

> echo !! | pbcopy

Wenn Sie einen Befehl aus Ihrem Verlauf wünschen, der nicht der letzte war , können Sie Folgendes ausführen:

> history

Verweisen Sie auf die gewünschte Befehlsnummer wie folgt:

> echo !5 | pbcopy
Sam Berry
quelle
Es mag Ihr Favorit sein und es mag sogar funktionieren, aber Sie müssen ein wenig erläutern, was der Befehl tatsächlich tut und wie der OP (der vor fünf Jahren eine der Antworten akzeptiert hat) ihn effektiv einsetzen kann.
IconDaemon
@IconDaemon guten Anruf. Ich denke, dies ist es wert, zu einer alten Frage hinzugefügt zu werden, da es einfacher ist als die akzeptierte Antwort, da keine Profilanpassung erforderlich ist.
Sam Berry
4

Ich bin hierher gekommen, um Sam Berrys exakt gleiche Antwort zu finden, aber das funktioniert bei mir nicht (OSX 10.14.6).

Hat es geschafft, mit Anführungszeichen um das zu tun !!:

echo "!!" | pbcopy

Chris Gillatt
quelle
3

Sie können Ihren Verlauf so einstellen, dass Befehle, die mit einem Leerzeichen beginnen, ignoriert werden:

export HISTIGNORE=' *'

Führen Sie dann den folgenden Befehl aus, um den letzten Befehl in die Zwischenablage zu kopieren (stellen Sie sicher, dass Sie am Anfang ein Leerzeichen haben):

history 1 | cut -d " " -f 4- | pbcopy

Wahrscheinlich möchten Sie den Befehl dann als Alias ​​speichern, damit Sie ihn sich leichter merken können.

kidbrax
quelle