Prima di tutto, nota che la tua cronologia è già in un file. Se stai eseguendo bash, il suo nome è di solito ~/.bash_history
. Più specificamente, è qualunque cosa tu abbia impostato la variabile HISTFILE
. Se vuoi copiarlo in un altro file, eseguicat "$HISTFILE" > hist.txt
Ora, il motivo per cui il history
comando non funziona in uno script di shell bash, è perché gli script vengono eseguiti in una shell figlio non interattiva della sessione di shell corrente. Le shell secondarie non ereditano tutto l'ambiente del genitore (quindi non tutte le variabili impostate), ma solo le variabili che sono state esportate. Per illustrare, lo script seguente farà eco al valore della variabile $var
:
#!/bin/bash
echo "$var"
Ora, imposta $var
su qualcosa ed esegui lo script:
$ var="foo"
$ foo.sh
VAR:
Quindi, esportare prima la variabile:
$ var="foo"
$ export var
$ foo.sh
VAR: foo
Come puoi vedere, quando la variabile è stata esportata, è disponibile per le shell secondarie.
Come ho detto prima, la cronologia è memorizzata nel file a cui punta la variabile $HISTFILENAME
. Poiché ciò non viene esportato per impostazione predefinita, non è impostato durante l'esecuzione di uno script:
$ cat foo.sh
#!/bin/bash
echo "HISTFILE: $HISTFILE"
$ ./foo.sh
HISTFILE:
$ echo $HISTFILE
/home/terdon/.bash_history
Come puoi vedere nell'esempio sopra, la variabile HISTFILE
è impostata nella mia normale sessione di shell, ma è vuota quando eseguo lo script.
Quindi, per ottenere la cronologia, hai alcune opzioni:
Il HISTFILE
valore predefinito è $HOME/.bash_history
. Se non l'hai modificato, puoi semplicemente eseguire questo comando nel tuo script:
cat "$HOME/.bash_history" > history
Puoi passare la $HISTFILE
variabile al tuo script e cat
che:
#!/bin/bash
cat "$1" > history
Salvare quanto sopra foo.sh
ed eseguire in questo modo:
./foo.sh "$HISTORY"
Assicurarsi che la variabile sia esportata. Aggiungi questa riga ai tuoi file ~/.bash_profile
(se esiste) o ~/.profile
(se ~/.bash_profile
non esiste):
export HISTFILE
Quindi, disconnettersi e riconnettersi e si dovrebbe essere in grado di eseguire history > hist.txt
da uno script come previsto. Questo perché export VAR
significa "rendere $ VAR disponibile per le shell secondarie". In termini pratici, ciò significa che il valore di HISTFILE
sarà ereditato dalla shell non interattiva utilizzata per eseguire lo script.
Ora, mentre il HISTFILE
set sarà impostato, non è stato letto dalla shell che esegue lo script. Quindi, per farlo funzionare, dovresti history -r
prima leggerlo . L'intero script sarebbe simile al seguente:
$!/bin/bash
history -r
history > hist.txt
In alternativa, esportalo manualmente prima di eseguire lo script:
$ export HISTFILE
Ma dovrai ancora farlo history -r
nella sceneggiatura.
Puoi source
farlo come suggerito dalla risposta di @ p0llard .