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_history
arquivo ainda contém muitas duplicatas, apesar de ignorados.
PS: A saída de eco $HISTSIZE
e $HISTFILESIZE
são ambos=1000
Atualização: Encontrei o problema na entrada acima para .bashrc
. Apenas chamando history -a
em PROMPT_COMMAND
simplesmente acrescenta o último novo comando para o .bash_history. Portanto, o ignoredups
e erasedups
nã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 -r
e 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_profile
com 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.
fonte
bug-bash
lista de discussão um ano após a publicação desta: lists.gnu.org/archive/html/bug-bash/2013-07/msg00092.htmlRespostas:
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.
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.
fonte
É feio, e tenho certeza de que
sed
ouawk
seria melhor, mas eu tentei corrigir o mesmo problema adicionando isso no meu.bashrc
: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
grep
vários arquivos para tentar encontrar o histórico que você está procurando, o que às vezes pode ser demorado.fonte