
Estoy intentando guardar un archivo de historial diferente por pestaña/terminal, pero no puedo guardarlo inmediatamente después de ejecutar un comando. El historial simplemente se guarda cuando ejecuto "salir".
Esto es un problema ya que lo que quiero conseguir es tener una copia del historial por si falla el terminal o el ordenador.
Después de buscar en Internet, esto es lo que tengo en mi archivo .bashrc:
export HISTFILE="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND=$(history -a; $PROMPT_COMMAND)
¿Alguna idea de lo que estoy haciendo mal?
Gracias.
Respuesta1
Estás asignando PROMPT_COMMAND incorrectamente. Cuando escribes
PROMPT_COMMAND=$(history -a; $PROMPT_COMMAND)
Está ejecutando 'history -a' (que no produce ningún resultado) y luego ejecuta $PROMPT_COMMAND (que durante el inicio los scripts pueden estar vacíos) y asigna la salida de esos dos comandos (la cadena vacía) a PROMPT_COMMAND. Lo que quieres es simplemente:
PROMPT_COMMAND='history -a'
Si desea agregarlo a un comando existente actualmente, haga
PROMPT_COMMAND+="history -a${PROMPT_COMMAND+=; }$PROMPT_COMMAND"
Respuesta2
Por alguna razón que no puedo entender, esto funciona:
export HISTFILE_NEW="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND="history -w $HISTFILE_NEW; $PROMPT_COMMAND"
Si bien esto no
export HISTFILE="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
Por supuesto, la primera solución es más lenta que la teóricamente buena (la segunda) porque todo el historial se guarda cada vez que se escribe un nuevo comando.
Por lo tanto, si alguien sabe POR QUÉ es así y cómo se podría solucionar, se lo agradecería mucho.
Respuesta3
Respondiendo a la intención, en lugar de a la pregunta literal:
Mire el uso de script. Esto le dará comandos y su salida. Tenga en cuenta que esto no es una panacea, ya que cualquier comando que utilice la posición del cursor es difícil de descifrar más adelante.
Script de nombre: haga un script mecanografiado de la sesión del terminal
Script de sinopsis [-a] [-c COMANDO] [-f] [-q] [-t] [archivo]
Descripción Script hace un texto mecanografiado de todo lo impreso en su terminal. Es útil para estudiantes que necesitan un registro impreso de una sesión interactiva como prueba de una tarea, ya que el archivo mecanografiado se puede imprimir más tarde con lpr(1).
Si se proporciona el archivo de argumentos, el script guarda todos los diálogos en el archivo. Si no se proporciona ningún nombre de archivo, el texto mecanografiado se guarda en el archivo mecanografiado.
Opciones:
-a' Append the output to file or typescript, retaining the priorcontents.
-c COMMAND Ejecuta el COMMAND en lugar de un shell interactivo. Esto facilita que un script capture la salida de un programa que se comporta de manera diferente cuando su salida estándar no es un tty. -f' Vaciar la salida después de cada escritura. Esto es bueno para la telecooperación: una persona hace 'mkfifo foo; script -f foo' y otro puede supervisar en tiempo real lo que se hace usando 'cat foo'.
-q' Cállate.
-t' Salida de datos de sincronización al error estándar. Estos datos contienen dos campos, separados por un espacio. El primer campo indica cuánto tiempo ha transcurrido desde la salida anterior. El segundo campo indica cuántos caracteres se generaron esta vez. Esta información se puede utilizar para reproducir textos mecanografiados con retrasos de escritura y salida realistas.
El script finaliza cuando sale el shell bifurcado (un control-D para salir del shell Bourne (sh(1)), y salir, cerrar sesión o controlar-d (si ignorar de no está configurado) para el shell C, csh(1) ).
Ciertos comandos interactivos, como vi(1), crean basura en el archivo mecanografiado. El script funciona mejor con comandos que no manipulan la pantalla; los resultados están destinados a emular una terminal impresa. ...
Busque "man script" en Google. Si tiene un sistema operativo en particular, inclúyalo. Esta es la versión de Linux, pero existen versiones casi idénticas para *BSD, Mac. Probablemente también existan puertos de Windows.