Wie kann ich den letzten Befehl in einer Datei speichern?

29

Wenn ich meine Analysen mit der Bash-Shell durchführe, möchte ich häufig die Befehle, die ich verwendet habe und die mir gute Ergebnisse gebracht haben, in einer Datei im selben Verzeichnis (meinem "LOGBOOK", wie es heißt) speichern, damit ich überprüfen kann, was Ich habe getan, um diese Ergebnisse zu erzielen. Bisher bedeutete dies, dass ich entweder den Befehl vom Terminal aus kopierte oder "hoch" drückte, um den Befehl in einen echo"my command" >> LOGBOOKoder einen anderen ähnlichen Fehler zu ändern .

Ich habe neulich festgestellt, dass es ein historyTool gibt , aber ich kann keine Möglichkeit finden, damit den zuvor ausgeführten Befehl abzurufen, damit ich so etwas tun kann getlast >> LOGBOOK.

Gibt es eine schöne einfache Möglichkeit, dies zu tun. Wie gehen andere alternativ damit um, die Befehle für die Ergebnisse zu speichern, die sie haben?

MattLBeck
quelle

Antworten:

37

Wenn Sie verwenden bash, können Sie den fcBefehl verwenden, um Ihren Verlauf wie gewünscht anzuzeigen:

fc -ln -1

Damit drucken Sie Ihren letzten Befehl aus. -lBedeutet Liste, -nbedeutet, dass den Zeilen keine Befehlsnummern vorangestellt werden und -1nur der letzte Befehl angezeigt wird. Wenn das Leerzeichen am Zeilenanfang (bei mehrzeiligen Befehlen nur die erste Zeile) störend ist, können Sie es mit leicht genug entfernen sed. Machen Sie daraus eine Shell-Funktion, und Sie haben eine Lösung wie gewünscht ( getlast >> LOGBOOK):

getlast() {
    fc -ln "$1" "$1" | sed '1s/^[[:space:]]*//'
}

Das sollte so funktionieren, wie Sie es in Ihrer Frage gefragt haben.

Ich habe "$1" "$1"dem fcBefehl eine kleine Variation hinzugefügt . Auf diese Weise können Sie beispielsweise getlast mycommandfestlegen mycommand, dass die zuletzt aufgerufene Befehlszeile gedruckt werden soll. Wenn Sie also vor dem Ausführen eines anderen Befehls das Speichern vergessen haben, können Sie die letzte Instanz eines Befehls problemlos speichern. Wenn Sie kein Argument an übergeben getlast(dh fcas aufrufen fc -ln "" "", wird nur der letzte Befehl ausgegeben).

[Hinweis: Die Antwort wurde bearbeitet, um den Kommentar von @ Bram und das in der Antwort von @glenn jackman erwähnte Problem zu berücksichtigen.]

camh
quelle
5
Die erste Form fc -lnr | head -n 1kann abgekürzt werden fc -lnr -1.
Bram
@Bram: Gutes Zeug. Ich habe help fcfür meine Dokumentation verwendet. Die Bash-Manpage enthält weitere Details, einschließlich der Verwendung negativer Indizes. Eliminieren headist gut, weil der eine Befehl noch eingebaut ist und es jetzt keine Fork / Exec mehr gibt.
7.
1
Ich frage mich, warum der Befehl heißt fc...
imz - Ivan Zakharyaschev
9

Ein Problem bei der Antwort von @ camh ist, dass bei einem Befehl, der mehrere Zeilen umfasst, nur die erste Zeile angezeigt wird:

$ echo "one
> two
> three"
one
two
three

$ fc -lnr | head -1
         echo "one

Versuche dies:

$ alias getlast='fc -nl $((HISTCMD - 1))'

$ echo "one
> two
> three"
one
two
three

$ getlast
         echo "one
two
three"
Glenn Jackman
quelle
3
Aktivieren cmdhistbehebt Folgendes: "Wenn gesetzt, versucht bash, alle Zeilen eines mehrzeiligen Befehls im gleichen Verlaufseintrag zu speichern. Dies ermöglicht eine einfache Nachbearbeitung von mehrzeiligen Befehlen."
Mark McKinstry
2

Anstatt den Aufwärtspfeil zu verwenden, können Sie auch "!!"auf den vorherigen Befehl verweisen.

z.B

$ some -long --command --difficulty="very hard to remember"
$ echo "!!" >> LOGBOOK

hinweis: dies zitiert nicht den wörtlichen text

Ryanbraganza
quelle
5
Das wird den wörtlichen Befehl nicht erfassen. Falls Shell-Metazeichen vorhanden sind, werden diese ausgewertet und ersetzt. Pipelines brechen auch: ls | less-> echo !! >> LOGBOOK-> echo ls | less >> LOGBOOK.
8.
0

Sie können dies mit dem folgenden Befehl tun, wenn Sie die Bash-Shell verwenden:

$> history -a LOGBOOK

Damit werden alle Ihre Befehle aus der aktuellen Sitzung an diese Datei angehängt. Sie können auch einen Alias ​​in Ihre ~ / .bashrc-Datei einfügen, um dies mit einem einzigen Befehl zu tun:

$> alias getlast="history -a LOGBOOK"
stringbasic
quelle
1
Aber Ihnen fehlt die wichtigere Anforderung, dass ich nur die Befehle speichere, die funktioniert haben, und die Ergebnisse erhalte, die ich habe. Ich möchte nicht alle kürzlich ausgeführten Befehle speichern, sondern nur diejenigen auswählen, nachdem ich sie verwendet habe. Danke trotzdem.
MattLBeck