¿Cómo mantengo mi historial de bash en las sesiones?

27

Estoy trabajando en un objetivo x86 que ejecuta fedora 9.

Cada vez que lo reinicio, mi historial vuelve a algún estado y no tengo los comandos que tenía en las sesiones antes del reinicio.

¿Qué debo cambiar para tener el historial actualizado que tenía antes de reiniciar?

BЈовић
fuente
Se pregunta "¿Cómo mantengo mi historial de bash en las sesiones?", Que está relacionado con la programación de shell. El reinicio es una forma dramática de perder tu caparazón, eso es todo. No necesita cerrar el tema.
Jonathan Leffler
Buen punto: esto probablemente debería trasladarse a SuperUser.
BR
@ Jonathan Sí, tienes la pregunta correcta. No estaba seguro de qué preguntar exactamente.
Guardar cada comando justo después de que se haya ejecutado, no al final de la sesión también ayudará. Esto se debe a que si está ejecutando dos sesiones simultáneamente, sin la línea de abajo, bash guardará el historial de la sesión 1 (por ejemplo) cuando esté cerrado. Si se está ejecutando session-1 y desea acceder inmediatamente al historial de session-1 dentro de session-2, no podrá hacerlo a menos que agregue la línea siguiente al archivo .bashrc. PROMPT_COMMAND = 'history -a'
Abhinav

Respuestas:

16

Cual historia bash-history? Si está perdiendo el historial de bash y tiene varias sesiones a la vez, es porque cada sesión sobrescribe el historial de las demás.

Probablemente desee decirle a bash que no sobrescriba el historial cada vez, sino que lo agregue. Puede hacer esto modificando su .bashrc para que se ejecute shopt -s histappend.

También puede aumentar el tamaño de su archivo de historial exportando HISTSIZE para que sea un número grande (está en bytes, por lo que 100000 debería ser suficiente).

BR
fuente
77
HISTSIZEes el número de comandos para recordar, no el número de bytes.
Chris Down
10

Estaba sufriendo el mismo problema - pero mi .bashrcarchivo ya tenía el shopt -s histappendcorrecto y HISTFILE, HISTSIZE, HISTFILESIZE.

Para mí, el problema era que mi .bash_historyarchivo era propiedad de root en lugar de mi nombre de usuario, por lo que mi usuario nunca podría guardar en ese archivo al salir.

icc97
fuente
3
Acabo de descubrir que tenía exactamente el mismo problema con .bash_history propiedad de root. Desearía haberme dado cuenta antes de perder toda mi encantadora historia, pero no importa :-)
SamStephens
lo mismo aquí - terminó varios días de deambular :) gracias!
davka
1
sudo chmod your_user_name .bash_history¡lo hizo! Gracias.
wij
sudo chown user_name:user_name ~.bash_history¡resuelto!
Alper
3

Busque las variables de entorno HISTFILE, HISTSIZE, HISTFILESIZE.

Jonathan Leffler
fuente
2

He escrito un script para configurar un archivo de historial por sesión o tarea que se basa en lo siguiente.

    # write existing history to the old file
    history -a

    # set new historyfile
    export HISTFILE="$1"
    export HISET=$1

    # touch the new file to make sure it exists
    touch $HISTFILE
    # load new history file
    history -r $HISTFILE

No es necesario guardar todos los comandos del historial, pero guarda los que me interesan y es más fácil recuperarlos que luego ejecutar cada comando. Mi versión también enumera todos los archivos de historial y ofrece la posibilidad de buscar en todos ellos.

Fuente completa: https://github.com/simotek/scripts-config/blob/master/hiset.sh

simotek
fuente
1

Escribí algunas líneas en mi .bashrc que logran lo siguiente: Guardar cada sesión después de cada comando en un archivo. Habrá tantos archivos de historial como haya iniciado terminales. Al iniciar un nuevo terminal a partir del archivo de historial más reciente, cargue todos los archivos de historial de sesiones anteriores en el búfer de historial hasta alcanzar un umbral de recuento de líneas.

HISTCONTROL=''
HISTFOLDER=~/.bash_histories
HISTFILEEXT=history      # only files in $HISTFOLDER with this extension will be read
shopt -s histappend   # append when closing session
mkdir -p $HISTFOLDER
HISTFILE=$HISTFOLDER/$(date +%Y-%m-%d_%H-%M-%S_%N).$HISTFILEEXT  # create unique file name for this session. Nanoseconds seems to be unique enough, try: for ((i=0; i<=10; i++)); do date +%Y-%m-%d_%H-%M-%S_%N; done
# if HISTFILE unset, history is not saved on exit -> not really necessary if we save after each command, but its a double net safety
HISTSIZE=-1       # maximum number of commands to hold inside bash history buffer
HISTFILESIZE=-1   # maximum number of lines in history file
# history -a $HISTFILE # bash saves the total history commands entered since startup or since the last save and saves that amount of commands to the file. This means reading a history file after typing commands will trip up bash, but this won't be a problem if the history file is only loaded in the beginning. This means that only new commands are saved not all the old loaded commands, thereby we can load as many history files into the buffer as we want and still only save newly thereafter typed commands
PROMPT_COMMAND="history -a $HISTFILE; $PROMPT_COMMAND"  # This command is executed after very typed command -> save history after each command instead after only closing the session

# Load old histories from last 5 files/sessions
HISTLINESTOLOAD=2000
# --reverse lists newest files at first
names=($(ls --reverse $HISTFOLDER/*.$HISTFILEEXT 2>/dev/null))
toload=()
linecount=0
# Check if is really file and count lines and only append to $toload if linecount under $HISTLINESTOLOAD
for fname in ${names[*]}; do
    if test -f $fname; then
        linecount=$((linecount+$(wc -l < $fname) ))
        if test $linecount -ge $HISTLINESTOLOAD; then
            break
        fi
        toload+=($fname)
    fi
done
# Beginning with the oldest load files in $toload into bash history buffer
for (( i=${#toload[*]}-1; i>=0; i-- )); do
    history -r ${toload[$i]}
done
mxmlnkn
fuente
0

Me aseguraría de que .bash_history exista. Si no es así, bash no tiene dónde guardar el historial de comandos.

si .bash_history no existe, créelo ejecutando touch:

touch ~/.bash_history

esto solo crea el archivo .bash_history vacío en su directorio de inicio, que se llenará con sus comandos y debería persistir entre sesiones.

Ray Shah
fuente
0

Mi instancia de Amazon EC2 Ubuntu no estaba guardando el historial. .bashrctenía todos los comandos necesarios como se menciona en otras respuestas, pero lo único que faltaba era el archivo. Tuve que tocarlo para que funcione.

touch ~/.bash_history
Chankey Pathak
fuente
-1

Buena respuesta a esta pregunta está aquí:

http://linuxcommando.blogspot.com/2007/11/keeping-command-history-across-multiple.html

DanJ
fuente
3
¡Bienvenido a SuperUser! Incluya suficiente información en su respuesta para que el solicitante no tenga que hacer clic en un enlace externo. Además, asegúrese de que su respuesta no simplemente duplique las respuestas existentes (que, de un vistazo rápido a ese enlace, parece estar funcionando).
Indrek
//, parece un buen artículo. Pero creo que stackexchange está tratando de ser independiente de los destinos de enlace, al menos un poco. ¿Te importaría agregar una pequeña explicación?
Nathan Basanese