¿Se pueden unificar los archivos de historial en bash?


35

Ejecuto rutinariamente varias screensesiones en mis escritorios y servidores Linux.

Un problema con esto es que cuando grepreviso mi historial de comandos, encuentro que emití un comando en una sesión diferente y tengo que desconectar y volver a adjuntar para obtener ese elemento del historial.

¿Es posible 'forzar' que las historias actualizadas de manera diferente de múltiples sesiones vayan a una historia central?


Me encontré con un problema similar por el cual no podía ver el historial entre sesiones de terminal. Resulta que mi archivo ~ / .bash_history era propiedad de root y no se podía escribir. Cambiar el propietario / grupo a mi usuario solucionó el problema: sudo chown <usuario>: <grupo> ~ / .bash_history
mateo

Respuestas:


41

Hay dos cosas que debes hacer:

  1. Inserte el comando shopt -s histappenden su .bashrc. Esto se agregará al archivo de historial en lugar de sobrescribirlo.
  2. También en su .bashrc, insertar PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"y el archivo de historial se volverá a escribir y volver a leer cada vez que bash muestra el mensaje.

EDITAR: Gracias a e-t172 por el history -ntruco


66
Gracias por esto. Lo mejoré aún más usando PROMPT_COMMAND = "$ PROMPT_COMMAND; history -a; history -n". De esta manera, los comandos emitidos en otras sesiones aparecen inmediatamente en el historial de la sesión actual (bueno, primero debe presionar Intro para actualizar el historial).
Etienne Dechamps

8
No había PROMPT_COMMANDdefinido previamente, así que tuve que usar PROMPT_COMMAND="history -a; history -n"para evitar errores.
William Jackson

1
consulte la respuesta superuser.com/a/734410/250287 para ver los comandos correctos de historial -a, -c y -r.
mtd

Solo una alerta para el recién llegado: después de usar la reescritura del historial durante un tiempo, me di cuenta de que a menudo emitía los comandos incorrectos; cuando veas en la línea anterior algún comando, esperas que la flecha hacia arriba lo repita, y con esta configuración ya no es siempre el caso.
Tiago

11

No lo use history -a; history -n, no funciona como esperaba y le dejará con muchos comandos duplicados y fuera de orden en su historial. Una solución que funciona generalmente como se espera es la siguiente:

# unified bash history
shopt -s histappend
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

Usar una nueva línea en lugar de un punto y coma también es una forma corta de tratar el problema de punto y coma faltante / duplicado con PROMPT_COMMAND.


historia -a, -c, y luego -r es correcta ... esta debería ser la respuesta aceptada
mtd

1
El exportno es necesario. Debido a que se supone que las opciones de shell interactivas se establecen desde las ~/.bashrccuales se llama desde cada shell secundario, la herencia no es necesaria.
dolmen

¿Hay alguna buena razón para no usarlo PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"en su lugar?
Seis

Ese orden requeriría que uno almacene el último valor de salida antes de ejecutar los comandos del historial, ya que muchos comandos de solicitud dependen o lo muestran.
Adam Crane

-1

PROMPT_COMMAND no está definido por defecto en algunas distribuciones. Por ejemplo, se define en Arch, pero no en Debian.

Tengo un bashrc en mi Dropbox que uso mientras salto de distribución, e incluye:

PROMPT_COMMAND="$( [ '$PROMPT_COMMAND' ] && echo $PROMPT_COMMAND; )history -a; history -n"

Una solución horrible para un problema básico de programación de shell. La forma correcta:PROMPT_COMMAND="$PROMPT_COMMAND; history -a; history -n"
dolmen

Mejor:PROMPT_COMMAND="$PROMPT_COMMAND"$'\n''history -a; history -n'
dolmen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.