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 historycomando 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 $varsu 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 HISTFILEvalore 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 $HISTFILEvariabile al tuo script e catche:
#!/bin/bash
cat "$1" > history
Salvare quanto sopra foo.shed 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_profilenon esiste):
export HISTFILE
Quindi, disconnettersi e riconnettersi e si dovrebbe essere in grado di eseguire history > hist.txtda uno script come previsto. Questo perché export VARsignifica "rendere $ VAR disponibile per le shell secondarie". In termini pratici, ciò significa che il valore di HISTFILEsarà ereditato dalla shell non interattiva utilizzata per eseguire lo script.
Ora, mentre il HISTFILEset sarà impostato, non è stato letto dalla shell che esegue lo script. Quindi, per farlo funzionare, dovresti history -rprima 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 -rnella sceneggiatura.
Puoi sourcefarlo come suggerito dalla risposta di @ p0llard .