En primer lugar, tenga en cuenta que su historial ya está en un archivo. Si está ejecutando bash, su nombre suele ser ~/.bash_history. Más específicamente, es lo que sea que haya configurado la variable HISTFILE. Si desea copiarlo a otro archivo, simplemente ejecutecat "$HISTFILE" > hist.txt
Ahora, por qué el historycomando no funciona en un script de shell bash, es porque los scripts se ejecutan en un shell hijo no interactivo de su sesión de shell actual. Los shells secundarios no heredan todo el entorno del padre (por lo tanto, no todas las variables establecidas), solo las variables que se han exportado. Para ilustrar, el siguiente script hará eco del valor de la variable $var:
#!/bin/bash
echo "$var"
Ahora, establece $varalgo y ejecuta el script:
$ var="foo"
$ foo.sh
VAR:
A continuación, exporte la variable primero:
$ var="foo"
$ export var
$ foo.sh
VAR: foo
Como puede ver, cuando la variable se ha exportado, está disponible para shells secundarios.
Como mencioné antes, el historial se almacena en el archivo señalado por la variable $HISTFILENAME. Como eso no se exporta de forma predeterminada, no se establece cuando se ejecuta un script:
$ cat foo.sh
#!/bin/bash
echo "HISTFILE: $HISTFILE"
$ ./foo.sh
HISTFILE:
$ echo $HISTFILE
/home/terdon/.bash_history
Como puede ver en el ejemplo anterior, la variable HISTFILEse establece en mi sesión de shell normal, pero está vacía cuando se ejecuta el script.
Entonces, para obtener el historial, tiene algunas opciones:
El valor predeterminado HISTFILEvalor es $HOME/.bash_history. Si no ha cambiado eso, simplemente puede ejecutar este comando en su script:
cat "$HOME/.bash_history" > history
Puede pasar la $HISTFILEvariable a su script y cateso:
#!/bin/bash
cat "$1" > history
Guarde lo anterior como foo.shy ejecute así:
./foo.sh "$HISTORY"
Asegúrese de que la variable se exporte. Agregue esta línea a sus archivos ~/.bash_profile(si existe) o ~/.profile(si ~/.bash_profileno existe):
export HISTFILE
Luego, cierre la sesión y vuelva a iniciarla y debería poder ejecutar history > hist.txtdesde un script como se esperaba. Esto se debe a que export VARsignifica "poner $ VAR a disposición de los shells secundarios". En términos prácticos, esto significa que el valor de HISTFILEserá heredado por el shell no interactivo que utiliza para ejecutar su script.
Ahora, aunque HISTFILEse establecerá, el shell no lo ha leído al ejecutar el script. Entonces, para que funcione, history -rprimero debes leerlo . El guión completo se vería así:
$!/bin/bash
history -r
history > hist.txt
Alternativamente, simplemente expórtelo manualmente antes de ejecutar el script:
$ export HISTFILE
Pero aún lo necesitarás history -ren el guión.
Puede sourcehacerlo como lo sugiere la respuesta de @ p0llard .