Guardar el historial de bash de múltiples Konsole no funciona correctamente

9

Yo uso múltiples terminales Konsole. Y quiero que todos los comandos que escribo en cada terminal se guarden en el historial de comandos, para que el próximo konsole que abra tenga todos ellos. Para evitar que cada terminal sobreescriba el historial de comandos de la otra terminal, proporcioné la siguiente configuración en mi.bashrc

# avoid duplicates and commands starting with space
export HISTCONTROL=ignoredups:erasedups:ignorespace
# append history entries..
shopt -s histappend
#My machine reboots without warning sometimes.Hence to save commands instantaneously.
export PROMPT_COMMAND="history -a"  
export HISTSIZE=1000
PS1="\[\e[1;34m\]\! \[\e[0m\]"$PS1

Di la última línea para ver el número de comando en mi solicitud. El comando no. nunca ha superado los 600, pero aún algunos de mis viejos comandos están desapareciendo de la historia. Hay muchos comandos que se dan repetidamente, pero como era de esperar ignoredups, nunca aumenta el comando no en el indicador. Sin embargo, los comandos antiguos aún están desapareciendo, y el número de comandos en el historial siempre permanece un poco más de 500.

El .bash_historyarchivo todavía contiene muchos duplicados a pesar de las ignoraciones.

PD: La salida de echo $HISTSIZEy $HISTFILESIZEambos son=1000


Actualización: Encontré el problema en la entrada anterior a .bashrc. Sólo llamaba history -aen PROMPT_COMMANDsimplemente añade el último nuevo comando a la .bash_history. Entonces el ignoredupsy erasedupsno tiene ningún efecto.

¿Hay alguna manera de que todavía pueda escribir en .bash_history sin duplicados desde cada terminal? No quiero cargar todo el historial en cada símbolo del sistema history -ry volver a escribirlo de nuevo history -w, porque los comandos que emití en un terminal también aparecerán en otro terminal en ejecución paralela. Quiero que los comandos combinados aparezcan solo en una nueva terminal.

El enigma, por qué mi historia se estaba recortando a 500 está resuelto. Me di cuenta de que sucedía cada vez que entraba en esta máquina. Crear un .bash_profilecon la siguiente entrada resolvió este problema.

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

Ahora mi .bashrc se ejecuta cada vez que ssh también. Y el tamaño del archivo de historial ahora está aumentando monotónicamente.

indiajoe
fuente
¿Es esto lo que buscas? unix.stackexchange.com/questions/1288/…
jasonwryan
No. Quiero evitar el segundo requisito en la lista de Oli. No quiero que la historia de mi terminal diferente se mezcle. Hasta que empiece una nueva terminal. Esto es lo que ocurre naturalmente cuando apago correctamente mi máquina. Pero a veces el apagado correcto no es posible y, a menos que guarde el historial instantáneamente, todo se perderá de repente.
indiajoe
Suena bastante similar a la pregunta que aparece en la bug-bashlista de correo un año después de que se publicó esta pregunta: lists.gnu.org/archive/html/bug-bash/2013-07/msg00092.html
syntaxerror

Respuestas:

1

Llegué a la conclusión de que no es posible agregar los nuevos comandos directamente y, al mismo tiempo, eliminar los duplicados. Entonces, mi solución es ejecutar los siguientes comandos en un momento. o ponerlo en mi crontab.

tac $HOME/.bash_history | awk '!seen[$0]++' | tac > $HOME/.hist_Temp 
mv $HOME/.hist_Temp $HOME/.bash_history

El comando anterior mantendrá la última aparición de un comando y eliminará todas las repeticiones anteriores del archivo de historial sin estropear el orden.

indiajoe
fuente
0

Es feo, y estoy seguro de que sedo awksería mejor, pero trató de solucionar el mismo problema mediante la adición de esto en mi .bashrc:

export HISTFILE=.bash_history_`tty | python -c 'import sys ; sys.stdout.write(sys.stdin.read().strip().replace("/", "_"))'`

Esto creará un archivo de historial separado para cada terminal que abra, sin embargo, si ejecuta bash dentro de bash, usará el mismo historial, pero no debería sobrescribirse. Te advertiré con una advertencia de mi experiencia. Si bien esto funciona y evita que se sobrescriba grepel historial, debe usar varios archivos para intentar encontrar el historial que está buscando, lo que a veces puede llevar mucho tiempo.

umeboshi
fuente