Salvar o histórico do bash de vários Konsole não está funcionando corretamente


9

Eu uso vários terminais Konsole. E eu quero que todos os comandos que digito em todos os terminais sejam salvos no histórico de comandos, para que o próximo konsole que eu abra tenha todos eles. Para impedir que cada terminal sobrescreva o histórico de comandos do outro terminal, dei as seguintes configurações no meu.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

Eu dei a última linha para ver o número do comando no meu prompt. O comando no. nunca ultrapassou 600, mas alguns dos meus antigos comandos ainda estão desaparecendo da história. Existem muitos comandos que são dados repetidamente, mas, como esperado ignoredups, nunca aumenta o comando no prompt. No entanto, os comandos antigos ainda estão desaparecendo. E o número de comandos na história permanece sempre um pouco mais de 500.

O .bash_historyarquivo ainda contém muitas duplicatas, apesar de ignorados.

PS: A saída de eco $HISTSIZEe $HISTFILESIZEsão ambos=1000


Atualização: Encontrei o problema na entrada acima para .bashrc. Apenas chamando history -aem PROMPT_COMMANDsimplesmente acrescenta o último novo comando para o .bash_history. Portanto, o ignoredupse erasedupsnão tem efeito.

Existe alguma maneira, ainda posso escrever no .bash_history sem duplicatas de todos os terminais? Não quero carregar o histórico inteiro em cada prompt de comando history -re escrevê-lo novamente history -w, porque os comandos que eu emiti em um terminal também aparecerão em outro terminal em execução paralelo. Quero que os comandos combinados apareçam apenas em um novo terminal.

O enigma, por que minha história estava ficando reduzida a 500 está resolvido. Percebi que isso acontecia cada vez que entrava nessa máquina. Criar um .bash_profilecom a seguinte entrada resolveu esse problema.

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

Agora meu .bashrc é executado toda vez que eu ssh também. E o tamanho do arquivo de histórico agora está aumentando monotonicamente.



Não. Quero evitar o segundo requisito da lista de Oli. Não quero que a história do meu terminal diferente se confunda. Até eu iniciar um novo terminal. É o que acontece naturalmente quando desligo minha máquina corretamente. Às vezes, porém, o desligamento adequado não é possível e, a menos que eu salve o histórico instantaneamente, tudo será perdido repentinamente.
indiajoe

Parece muito parecido com a pergunta que aparece na bug-bashlista de discussão um ano após a publicação desta: lists.gnu.org/archive/html/bug-bash/2013-07/msg00092.html
syntaxerror

Respostas:


1

Concluí que não é possível anexar os novos comandos diretamente e ao mesmo tempo remover as duplicatas. Portanto, minha solução é executar os seguintes comandos em pouco tempo. ou colocá-lo no meu crontab.

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

O comando acima manterá a última ocorrência de um comando e removerá todas as outras repetições acima dele do arquivo de histórico sem atrapalhar a ordem.


0

É feio, e tenho certeza de que sedou awkseria melhor, mas eu tentei corrigir o mesmo problema adicionando isso no meu .bashrc:

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

Isso criará um arquivo de histórico separado para cada terminal que você abrir, no entanto, se você executar o bash no bash, ele usará o mesmo histórico, mas não deve sobrescrever. Vou avisá-lo com uma ressalva da minha experiência. Embora isso funcione e evite que o histórico seja sobrescrito, é necessário grepvários arquivos para tentar encontrar o histórico que você está procurando, o que às vezes pode ser demorado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.