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 history
comando 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 $var
algo 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 HISTFILE
se 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 HISTFILE
valor 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 $HISTFILE
variable a su script y cat
eso:
#!/bin/bash
cat "$1" > history
Guarde lo anterior como foo.sh
y 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_profile
no existe):
export HISTFILE
Luego, cierre la sesión y vuelva a iniciarla y debería poder ejecutar history > hist.txt
desde un script como se esperaba. Esto se debe a que export VAR
significa "poner $ VAR a disposición de los shells secundarios". En términos prácticos, esto significa que el valor de HISTFILE
será heredado por el shell no interactivo que utiliza para ejecutar su script.
Ahora, aunque HISTFILE
se establecerá, el shell no lo ha leído al ejecutar el script. Entonces, para que funcione, history -r
primero 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 -r
en el guión.
Puede source
hacerlo como lo sugiere la respuesta de @ p0llard .