Como mantenho meu histórico do bash nas sessões?

27

Estou trabalhando em um destino x86 executando o fedora 9.

Sempre que eu o reinicializo, meu histórico retorna a algum estado e não tenho comandos que eu fiz nas sessões anteriores à reinicialização.

O que preciso alterar para ter o histórico atualizado que eu tinha antes da reinicialização?

BЈовић
fonte
Ele está perguntando "Como mantenho meu histórico do bash entre as sessões?", Que está relacionado à programação de shell. A reinicialização é uma maneira dramática de perder seu shell, só isso. Não precisa fechar o tópico.
Jonathan Leffler
Bom ponto - provavelmente isso deve ser movido para o Superusuário.
BR
@ Jonathan Sim, você entendeu a pergunta corretamente. Eu não tinha certeza do que exatamente perguntar.
Salvar cada comando logo após sua execução, não no final da sessão, também ajudará. Isso ocorre porque, se você estiver executando duas sessões simultaneamente, sem a linha abaixo, o bash salvará o histórico da sessão 1 (por exemplo) quando estiver fechada. Se a sessão 1 estiver em execução e você desejar acessar imediatamente o histórico da sessão 1 na sessão 2, não será possível, a menos que adicione a linha abaixo ao arquivo .bashrc. PROMPT_COMMAND = 'history -a'
Abhinav

Respostas:

16

Qual história? história da festa? Se você está perdendo o histórico do bash e tem várias sessões por vez, é porque cada sessão está substituindo o histórico das outras sessões.

Você provavelmente quer dizer ao bash para não substituir o histórico a cada vez, mas sim anexá-lo. Você pode fazer isso modificando seu .bashrc para executar shopt -s histappend.

Você também pode aumentar o tamanho do seu arquivo de histórico exportando HISTSIZE para um número grande (é em bytes, portanto 100000 deve ser suficiente).

BR
fonte
7
HISTSIZEé o número de comandos a serem lembrados, não o número de bytes.
Chris Baixo
10

Eu estava sofrendo do mesmo problema - mas meu .bashrcarquivo já teve a shopt -s histappendcorrecta e HISTFILE, HISTSIZE, HISTFILESIZE.

Para mim, o problema era que meu .bash_historyarquivo pertencia à raiz e não ao meu nome de usuário, para que meu usuário nunca pudesse salvá-lo na saída.

icc97
fonte
3
Acabei de descobrir que tinha exatamente o mesmo problema com o .bash_history pertencente ao root. Eu gostaria de ter percebido antes que eu tinha perdido toda a minha linda história, mas deixa pra lá :-)
SamStephens
mesmo aqui - terminou vários dias de perambulação :) obrigado!
Davka 5/03
1
sudo chmod your_user_name .bash_historyconseguiu! Obrigado.
wij
sudo chown user_name:user_name ~.bash_historyResolvi-o!
Alper 8/08
3

Procure as variáveis ​​de ambiente HISTFILE, HISTSIZE, HISTFILESIZE.

Jonathan Leffler
fonte
2

Eu escrevi um script para definir um arquivo de histórico por sessão ou tarefa, com base no seguinte.

    # 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

Não é necessário salvar todos os comandos do histórico, mas salva os que mais me interessam e é mais fácil recuperá-los do que passar por todos os comandos. Minha versão também lista todos os arquivos de histórico e fornece a capacidade de pesquisar por todos eles.

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

simotek
fonte
1

Eu escrevi algumas linhas no meu .bashrc que realizam o seguinte: Salve todas as sessões após cada comando em um arquivo. Haverá tantos arquivos de histórico quanto você já iniciou os terminais. Ao iniciar um novo terminal a partir do arquivo de histórico mais recente, carregue todos os arquivos de histórico de sessões anteriores no buffer de histórico até que um limite de contagem de linhas seja atingido.

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
fonte
0

Eu garantiria que .bash_history exista. Caso contrário, não há lugar para o bash salvar o histórico de comandos.

se .bash_history não existir, crie-o executando o toque:

touch ~/.bash_history

isso apenas cria o arquivo .bash_history vazio em seu diretório pessoal, que será preenchido com seus comandos e deve persistir entre as sessões.

Ray Shah
fonte
0

Minha instância do Amazon EC2 Ubuntu não estava salvando o histórico. .bashrctinha todos os comandos necessários, como mencionado em outras respostas, mas a única coisa que estava faltando era o arquivo. Eu tive que tocá-lo para fazê-lo funcionar.

touch ~/.bash_history
Chankey Pathak
fonte
-1

A boa resposta para esta pergunta está aqui:

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

DanJ
fonte
3
Bem-vindo ao SuperUser! Inclua na sua resposta informações suficientes para que o solicitante não precise clicar em um link externo. Além disso, certifique-se de que sua resposta não duplique simplesmente as respostas existentes (o que, de uma rápida olhada nesse link, parece estar funcionando).
Indrek
//, parece um bom artigo. Mas acho que a stackexchange está tentando ser independente dos destinos dos links, pelo menos um pouco. Se importa de adicionar uma pequena explicação?
Nathan Basanese