En primer lugar, este no es un duplicado de ningún subproceso existente en SE. He leído estos dos hilos ( 1º , 2º ) sobre un mejor historial de bash, pero ninguna de las respuestas funciona - Por cierto, estoy en Fedora 15.
.bashrc
Agregué lo siguiente al archivo en el directorio de usuarios (/ home / aahan /), y no funciona. Alguien tiene una pista?
HISTCONTROL=ignoredups:erasedups # no duplicate entries
HISTSIZE=1000 # custom history size
HISTFILESIZE=100000 # custom history file size
shopt -s histappend # append to history, don't overwrite it
PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND" # Save and reload the history after each command finishes
Bien, esto es lo que quiero con el historial de bash (prioridad):
- no almacene duplicados, borre los existentes
- compartir inmediatamente el historial con todas las terminales abiertas
- siempre agregue el historial, no lo sobrescriba
- almacenar comandos de varias líneas como un solo comando (que está desactivado de manera predeterminada)
- ¿Cuál es el tamaño predeterminado del historial y el tamaño del archivo histórico?
bash
command-history
soy yo
fuente
fuente
echo $SHELL
) ¿Funcionan los ajustes si los ejecuta manualmente desde su shell abierto? Obviamente, dado que funcionan para muchos otros, la configuración es correcta, simplemente los está implementando incorrectamente. Y no Fedora15 / Gnome3 / ser una máquina virtual tiene poco que ver con la función real debash
..bashrc
archivo. ¿Es eso incorrecto? ¿Puedes agregar una "respuesta" a esta publicación con los comandos de shell reales? (por favor, tenga con mi noob-dad.).bashrc
SON comandos de shell reales. Las secuencias de comandos son solo series de comandos de shell. Además, la edición que realizó recientemente al eliminar elexport
bit fue una mala idea, que debe mantenerse.Respuestas:
Este es realmente un comportamiento realmente interesante y confieso que he subestimado enormemente la pregunta al principio. Pero primero los hechos:
1. Lo que funciona
La funcionalidad se puede lograr de varias maneras, aunque cada una funciona un poco diferente. Tenga en cuenta que, en cada caso, para que el historial se "transfiera" a otro terminal (actualizado), uno tiene que presionar Enteren el terminal, donde desea recuperar el historial.
Opción 1:
Esto tiene dos inconvenientes:
opcion 2:
(Sí, no es necesario
shopt -s histappend
y sí, tiene que estarhistory -c
en el medio dePROMPT_COMMAND
) Esta versión también tiene dos inconvenientes importantes:history
comando puede dar resultados falsos, ver más abajo.[Editar] "Y el ganador es ..."
opción 3:
Esto es lo más lejos que puede llegar. Es la única opción para tener ambos
erasedups
y el historial común trabajando simultáneamente. Esta es probablemente la solución final a todos sus problemas, Aahan.2. ¿Por qué la opción 2 no parece funcionar (o: lo que realmente no funciona como se espera)?
Como mencioné, cada una de las soluciones anteriores funciona de manera diferente. Pero la interpretación más engañosa de cómo funciona la configuración proviene del análisis de la salida del
history
comando . En muchos casos, el comando puede dar resultados falsos . ¿Por qué? Porque se ejecuta antes de la secuencia de otroshistory
comandos contenidos enPROMPT_COMMAND
! Sin embargo, cuando se usa la segunda o tercera opción, uno puede monitorear los cambios de.bash_history
contenido (usando,watch -n1 "tail -n20 .bash_history"
por ejemplo) y ver cuál es el historial real.3. ¿Por qué la opción 3 es tan complicada?
Todo radica en la forma en que
erasedups
funciona. Como dice el manual de bash, "(...)erasedups
hace que todas las líneas anteriores que coincidan con la línea actual se eliminen de la lista del historial antes de que esa línea se guarde" . Entonces, esto es realmente lo que quería el OP (y no solo, como pensaba anteriormente, que no aparezcan duplicados en secuencia ) . He aquí por qué cada uno de loshistory -.
comandos tiene o no puede estar enPROMPT_COMMAND
:history -n
tiene que estar allí anteshistory -w
para leer.bash_history
los comandos guardados desde cualquier otra terminal,history -w
tiene que estar allí para guardar el historial en un archivo y borrar duplicados,history -a
no debe colocarse allí en lugar dehistory -w
, ya que no activa el borrado de duplicados,history -c
también es necesario porque evita destruir el búfer de historial después de cada comando,y finalmente,
history -r
es necesario para restaurar el búfer de historial desde el archivo, por lo que finalmente se comparte el historial entre las sesiones de terminal.fuente
watch "tail -n 20 .bash_history"
lugar detail -f .bash_history
.history -c
también es necesario porque evita destruir el búfer de historial después de cada comando ¿Por qué ocurre esta eliminación?En su comando rápido, está utilizando el
-c
interruptor. Deman bash
:Para compartir su historial con todos los terminales abiertos, puede usar
-n
:El tamaño predeterminado también está en el manual:
Para guardar comandos de varias líneas:
Además, no debe anteponer los comandos HIST * con
export
: son variables solo bash, no variables ambientales:HISTCONTROL=ignoredups:erasedups
es suficiente.fuente
export PROMPT_COMMAND="history -a; history -n; history -r; $PROMPT_COMMAND"
es correcto? Además, ¿sabes cómo puedo hacer que el archivo de historial almacene comandos de varias líneas como un solo comando (que está desactivado de forma predeterminada)?shopt -s cmdhist
guardará varias líneas.HISTCONTROL=ignoredups:erasedups
no funciona. También intenté tener eso en el.bashrc
archivo (entre las funciones personalizadas). ¿Alguna idea de lo que podría estar mal? Estoy usando Fedora 15 en una máquina virtual - - Windows 7 host./etc/bashrc
,.bash_profile
etc. , que lo anule..bash_profile
archivo. En cuanto al contenido/etc/bashrc
que lo puse aquí, eche un vistazo - pastebin.com/Uae6sE6sEsto es lo que se me ocurrió y estoy feliz con eso hasta ahora ...
NOTAS
HISTIGNORE
ignora todos los comandos que no tienen argumentos. Esto puede no ser deseable para algunas personas y puede omitirse.fuente
Use esto en su lugar:
fuente
No funciona porque te olvidas de:
Pero parece
history -n
que solo tiene errores cuandoexport HISTCONTROL=ignoreboth:erasedups
está en vigor.Vamos a experimentar:
Aquí activamos la eliminación de duplicados, cambiamos el historial al archivo personalizado y borramos el historial. Después de completar todos los comandos, tenemos un archivo de historial vacío y un comando en el historial actual.
Abra la segunda terminal y ejecute esos seis comandos también. Después de esto:
Ahora su historial actual tiene dos comandos y el archivo de historial tiene:
Volver a la primera terminal:
Huh ... ninguno de los
echo
comandos se leen. Cambie a la segunda terminal nuevamente y:Ahora el archivo de historial es:
Cambie a la primera terminal nuevamente:
Puede ver que el
echo "Z"
comando se fusionó conhistory -n
.Otro error se debe a que los comandos se leen del historial por número de comando y no por tiempo de comando, creo. Espero que otros
echo
comandos aparecieron en la historiafuente
erasedups no recorta (como chomp en algunos idiomas) los espacios iniciales y finales. Esto es un error Además, borrado no elimina todas las entradas anteriores.
fuente