Bash deshabilita el historial en shells no interactivos de forma predeterminada, pero puede activarlo.
#!/bin/bash
HISTFILE=~/.bash_history
set -o history
history | tail …
Pero si está intentando monitorear la actividad en ese servidor, el historial de shell no sirve para nada (es trivial ejecutar comandos que no aparecen en el historial). Consulte ¿Cómo puedo registrar todos los inicios de procesos en Linux ?
Si está depurando un script, el historial de shell no es la mejor manera de obtener información útil. Una herramienta mucho mejor es la función de seguimiento de depuración: coloque set -x
cerca de la parte superior de la secuencia de comandos. La traza se escribe en error estándar.
Gilles 'SO- deja de ser malvado'
fuente
histtest.sh: 5: set: Illegal option -o history
sh
guión está marcado por la redacción exacta del mensaje de error). Para acceder al historial de bash, debe usar bash (secuencia de comandos que comienza con#!/bin/bash
o#!/usr/bin/env bash
).Illegal option
(diríaset: history: invalid option name
).set -o history
a la historia que luego va a ser rellenado con entradas comoif [...
vars=$(...
etc.set -x
es mucho más útil.No estoy seguro de si realmente usa la capacidad de historial cuando se ejecuta de forma no interactiva, de lo contrario, cada script de shell que ejecute desordenaría su historial de comandos.
¿Por qué no ir directamente a la fuente
${HOME}/.bash_history
, reemplazarhistory | tail -100
contail -100 ${HOME}/.bash_history
. (Si usa marcas de tiempo, probablemente tenga que hacer algo similargrep -v ^# ${HOME}/.bash_history | tail -100
).fuente
greq -v '^#[0-9]\+$'
(a veces "ejecuto" comentarios en mi shell ...)history
y la salida delgrep
método ...history -a; history -c; history -r
. (agregar, borrar, leer)Si desea usar la salida del
history
comando desde una sesión de shell activa en un script, puede usar un alias para ejecutar el comando primero. Luego, en el mismo alias, puede llamar al resto del script. Con dicha configuración, puede lograr esencialmente el mismo resultado que tener elhistory
comando en el script real.Por ejemplo, puede crear un alias como este, suponiendo que el nombre del script sea script.sh:
Y cambie el guión a esto:
Encontré esta pregunta mientras escribía un proceso para combinar, ordenar y sincronizar
~/bash_history
archivos en dos computadoras para que sea fácil buscar comandos que he usado en el pasado.Es mucho menos complicado actualizar mi archivo de historial acumulativo sin tener que iniciar sesión en un nuevo shell para
~/bash_history
actualizarlo. Para monitorear un servidor esto obviamente no funcionará, como se menciona en las otras respuestas.Mi uso en particular es:
El script
hby.sh
luego extrae todas las entradas únicas de todos los~/.bash_history*
archivos.fuente
El historial incorporado parece estar deshabilitado dentro de un script de shell. Ver aquí: http://www.tldp.org/LDP/abs/html/histcommands.html
No he encontrado ninguna documentación oficial sobre esto.
fuente
Cree una secuencia de comandos con el nombre a
script.sh
continuación. Crea un script llamado X y pone Y Número de líneas de su historial en él.Luego, si desea crear un script para realizar una tarea llamada "tarea" en la que ha estado trabajando durante las últimas 14 líneas ejecutadas
¡Luego limpia tu historial para hacer un buen guión!
fuente
histtest.sh: 5: set: Illegal option -o history
El comando de historial está deshabilitado de manera predeterminada en el script bash, por eso incluso el comando de historial no funcionará en el archivo .sh. para su redirección, redirija amablemente el archivo bash_history dentro del archivo .sh.
o el mecanismo de historial también se puede habilitar al mencionar el archivo de historial y cambiar los parámetros de tiempo de ejecución como se menciona a continuación
nota: mencionado anteriormente dos líneas en la parte superior del archivo de script. ahora el comando de historia funcionará en la historia.
fuente
Cada usuario tiene su propio archivo de historial que es el resultado del comando de historial. En lugar de usar el comando de historial en su script de shell, puede usar el archivo de historial para el usuario. Habrá un
.bash_history
archivo en el directorio de inicio del usuario, que será el archivo de historial para el usuario.fuente
Respuesta corta :
se usa
history -p
para realizar una expansión de historial explícitamente.Un ejemplo sigue.
Un caso de uso que me sucede mucho es:
Como ha sido mi fiesta
set -o histexpand
, generalmente lo que hice fue escribirpara editar aquellos archivos listados por comando anterior.
Lamentablemente, a veces ocurre un error, así que habilito verificar por
shopt -s histverify
.Ahora puedo verificar la expansión, con el costo de una Returnclave adicional .
Hoy quiero envolver esos detalles en una función bash ya que los uso mucho,
Aquí uso dos anidados
command substitution
, el interno para expandir!!
al comando anterior, el externo para ejecutarlo y obtener el resultado.¡Ahora puedo lograr el mismo efecto, con solo tres teclas, y una de ellas es Return!
fuente