¿Es posible hacer que la escritura en .bash_history sea inmediata?

¿Es posible hacer que la escritura en .bash_history sea inmediata?

A menudo abro muchísimos terminales (en este momento, tengo siete abiertos en este espacio de trabajo) y a menudo busco historycon greppara encontrar un comando que acabo de escribir recientemente, pero no quiero buscar el terminal y luego desplazarme Levántate y búscalo.

A veces mis terminales se cierran sin exit, y todo lo que he escrito en ellos se pierde. A veces necesitaba algo que había escrito en una terminal que estaba muerta.

¿Hay alguna manera de lograr que cada terminal escriba .bash_historyinmediatamente? ¿O al menos una vez por minuto o algo así?

Respuesta1

Una solución simple se detalla enActualizar el historial de Bash en tiempo real.

Dice poner esos comandos en la configuración .bashrc:

shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

El primer comando cambia el modo del archivo histórico para agregar y el segundo configura el history -acomando para que se ejecute en cada símbolo del shell. La -aopción hace que historyse escriban inmediatamente las líneas actuales/nuevas en el archivo histórico.

Deman bash:

Si la opción de shell histappend está habilitada (consulte la descripción de shopt en COMANDOS INTEGRADOS DE SHELL a continuación), las líneas se agregan al archivo de historial; de lo contrario, el archivo de historial se sobrescribe.

Relacionado con Zsh:

Respuesta2

Intenta poner esto en tu .bashrc:

shopt -s histappend                      # append to history, don't overwrite it
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Crédito aquí:https://stackoverflow.com/questions/103944/real-time-history-export-amongst-bash-terminal-windows/3055135

history -cBorra el historial de la sesión en ejecución. Esto reducirá el contador de historial en la cantidad de $HISTSIZE. history -rlea el contenido $HISTFILEe insértelo en el historial de la sesión en ejecución actual. Esto aumentará el contador del historial en la cantidad de líneas en $HISTFILE.

Creo que significa que los comandos están disponibles casi de inmediato (tiene una terminal, escriba echo 1, segunda terminal echo 2, primero echo 3y al presionar la flecha hacia abajo dos veces, debería tener echo 2disponible. Debe emitir un comando en una terminal determinada para tener acceso a lo que tiene sido escrito.

Respuesta3

Tengo un archivo de historial grande con aproximadamente 100000 entradas, y las variantes que borran la lista del historial y leen todo el archivo del historial (usando history -cy history -r) introducen un retraso notable (tal vez 0,2 segundos) antes de que se muestre el mensaje. Usarlo history -npara que solo se lean las líneas nuevas del archivo histórico es más rápido:

shopt -s histappend
PROMPT_COMMAND='history -a;history -n'

PROMPT_COMMANDno es necesario exportarlo porque es una variable de shell.

Respuesta4

Una nota para todas las demás respuestas (que son básicamente lo mismo):

Establecerlo PROMPT_COMMAND="history -a;$PROMPT_COMMAND"en .bashrc(o amigos) es suficiente.

Además, puede ejecutar manualmente history -acuando desee "hacer una instantánea" del historial de la sesión actual.

El comando shopt -s histappendno es necesario porque history -asiempre agrega nuevas líneas al archivo y nunca lo sobrescribe. Además, al menos a partir de Bash 4, histappendes el comportamiento predeterminado.

información relacionada