Tengo .bash_profile configurado para exportar a un archivo de historial:
export HISTFILE=/root/history/.bash_hist-$(who -m | awk '{print $1}')
Luego estoy exportando marcas de tiempo para el comando de historial.
export HISTTIMEFORMAT="%Y/%m/%d %T "
Esta combinación provocó que se escribieran marcas de tiempo de época en el archivo histórico:
#1463962023
top
Así que escribí en Perl una línea en .bash_profile para escribir solo la marca de tiempo legible por humanos en el archivo, eliminando así la línea de época: (y algunas otras líneas)
format_history () {
local file=/root/history/.bash_hist-$(who -m | awk '{print $1}')
perl -i -pe 's/^#(\d{10})$/"# ".localtime($1)/e' "$file"
}
shopt -s histappend
PROMPT_COMMAND="history -a;format_history;$PROMPT_COMMAND"
Ahora mi archivo exportado se ve así:
# Sun May 22 19:06:41 2016
last
Lo cual es genial y exactamente lo que quiero. Sin embargo, esto tiene el efecto secundario no deseado de agregar una línea dedicada en el comando de historial que no contiene nada más que fechas que no necesitan estar allí.
824 2016/05/22 19:07:33 # Sun May 22 19:06:41 2016
825 2016/05/22 19:07:33 last
¿Cómo puedo escribir en el archivo como quiero sin que el comando de historial informe estas líneas no deseadas?
NOTA: esta anomalía con el comando de historial parece "activarse" cuando inicio sesión en un sistema. (Yo uso ssh). Puedo estar en sesión, ejecutar 10 comandos, luego ejecutar el comando de historial y todo parece normal. Sin embargo, tan pronto como cierre la sesión, vuelva a iniciarla y ejecute el comando de historial, se mostrarán líneas erróneas.
ACTUALIZACIÓN: He reducido el problema a la línea:
PROMPT_COMMAND="history -a;format_history;$PROMPT_COMMAND"
Cuando comento esta línea, el comando de historial funciona como se esperaba. Sin embargo, este también fue el comando que ejecutó el formateo en el archivo histórico. He intentado eliminar la parte "historial -a" de la línea, dejando el resto, pero eso no hace ninguna diferencia. Si dejara toda la línea comentada, ¿cómo podría invocar el formato del archivo usando el script Perl?
Respuesta1
Dejaría el archivo de historial en paz y, en su lugar, implementaría la grabación de comandos en el controlador Prompt_Command. También haría que se escriba en un archivo de registro privado para que no tenga conflictos con otros usos del archivo de historial o problemas con otros usuarios que acceden a /root.