Come posso salvare l'ultimo comando in un file?


29

Quando eseguo le mie analisi usando la shell bash, spesso voglio salvare i comandi che ho usato che mi hanno dato buoni risultati a un file nella stessa directory (il mio "LOGBOOK", come viene chiamato) in modo da poter controllare cosa Ho fatto per ottenere quei risultati. Finora questo mi ha significato copiare o inviare il comando dal terminale o premere "su" modificando il comando in una echo"my command" >> LOGBOOK, o altre buffonate simili.

Ho scoperto che c'era uno historystrumento l'altro giorno, ma non riesco a trovare un modo per usarlo per ottenere il comando precedentemente eseguito in modo da poter fare qualcosa del genere getlast >> LOGBOOK.

C'è un bel modo semplice per farlo. In alternativa, in che modo gli altri gestiscono il salvataggio dei comandi per i risultati ottenuti?

Risposte:


37

Se si sta utilizzando bash, è possibile utilizzare il fccomando per visualizzare la cronologia nel modo desiderato:

fc -ln -1

Questo stamperà il tuo ultimo comando. -lsignifica elenco, -nsignifica non aggiungere il prefisso alle righe con i numeri di comando e -1dice di mostrare solo l'ultimo comando. Se lo spazio bianco all'inizio della riga (solo la prima riga su comandi multilinea) è fastidioso, puoi liberartene abbastanza facilmente con sed. Trasformalo in una funzione shell e hai una soluzione come richiesto ( getlast >> LOGBOOK):

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

Dovrebbe funzionare come hai fatto nella tua domanda.

Ho aggiunto una leggera variazione aggiungendo "$1" "$1"al fccomando. Questo ti permetterà di dire, ad esempio, getlast mycommanddi stampare l'ultima riga di comando che invoca mycommand, quindi se hai dimenticato di salvare prima di eseguire un altro comando, puoi comunque salvare facilmente l'ultima istanza di un comando. Se non si passa un argomento a getlast(es. Invoke fcas fc -ln "" "", stampa solo l'ultimo comando).

[Nota: risposta modificata per tenere conto del commento di @ Bram e del problema menzionato nella risposta di @glenn jackman.]


5
Il primo modulo fc -lnr | head -n 1può essere abbreviato in fc -lnr -1.
Bram,

@Bram: roba buona. Stavo usando help fcper la mia documentazione. La pagina man di bash contiene maggiori dettagli, incluso questo uso di indici negativi. L'eliminazione headè buona perché l'unico comando a sinistra è incorporato, quindi ora non c'è fork / exec.
Camh,

1
Mi chiedo perché il comando si chiama fc...
imz - Ivan Zakharyaschev


9

Un problema con la risposta di @ camh è se hai un comando che si estende su più righe, mostra solo la prima riga:

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

$ fc -lnr | head -1
         echo "one

Prova questo:

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

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

$ getlast
         echo "one
two
three"

3
l'abilitazione cmdhistrisolverà ciò: "Se impostato, bash tenta di salvare tutte le righe di un comando a più righe nella stessa voce della cronologia. Ciò consente di modificare facilmente i comandi a più righe".
Mark McKinstry,

2

Invece di utilizzare la freccia su, è possibile utilizzare "!!"per fare riferimento al comando precedente.

per esempio

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

nota: questo non cita il testo letterale


5
Ciò non catturerà il comando letterale. Se ci sono metacaratteri di shell, saranno valutati e sostituiti. Le condutture si romperanno anche: ls | less-> echo !! >> LOGBOOK-> echo ls | less >> LOGBOOK.
Camh,

0

Puoi farlo con il seguente comando se stai usando la shell bash:

$> history -a LOGBOOK

Questo aggiungerà tutti i tuoi comandi dalla sessione corrente a quel file, puoi anche aggiungere un alias sul tuo file ~ / .bashrc per farlo con un singolo comando:

$> alias getlast="history -a LOGBOOK"

1
Ma ti manca il requisito più importante che io salvi solo i comandi che hanno funzionato e ho ottenuto i risultati che ho. Non voglio salvare tutti i comandi recenti che ho fatto, selezionane solo uno dopo averli usati. Grazie comunque.
MattLBeck
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.