Por alguma razão, não consigo fazer com que meu sistema mantenha meu histórico do BASH após uma reinicialização. Aqui estão as seções relevantes do meu ~/.bashrc
:
shopt -s histappend
PROMPT_COMMAND='history -a; updateWindowTitle'
export HISTCONTROL=ignoredups
export HISTSIZE=9999
export HISTFILESIZE=999999
export HISTFILE="$HOME/.bash_history"
Tanto quanto posso dizer, essas são todas as opções necessárias (eu sei que costumava manter o histórico em várias reinicializações sem todas elas no passado). No entanto, apesar de ter adicionado essas opções várias reinicializações atrás, ainda perco a maior parte do meu histórico após uma reinicialização. Não está vazio, mas não possui as 9999 linhas que eu tinha antes de reiniciar.
Antes que alguém reclame, sim, eu li essas perguntas. Eu implementei algumas de suas sugestões, conforme listado acima, o restante foi inútil ou não relevante:
- Perda de histórico de bash ao usar histappend
- Como impedir que o Bash altere o histórico?
- O que determina o que aparece no comando bash history?
- Como mantenho meu histórico do bash nas sessões?
- salvar o histórico do bash, regularmente
Com a chance de haver outros comandos relevantes, você pode ver todo o meu ~/.bashrc
aqui .
Então, o que estou perdendo? Por que minha história não é salva? Se alguém achar que outro arquivo pode ser relevante, informe-me e eu o publicarei. Eu verifiquei executando grep -i hist \.*
no meu $HOME
que mostrou que o único .
arquivo relevante contendo a string hist
ou HIST
era .bashrc
.
Estou executando o Linux Mint Debian Edition, GNU bash, versão 4.2.36 (1) -release (x86_64-pc-linux-gnu) e meu emulador de terminal favorito (caso isso seja relevante) é terminator
.
ATUALIZAR:
Seguindo a sugestão do @ mpy nos comentários, mudei meu ~/.bashrc
para definir HISTFILE=~/bash_history
em oposição ao padrão ~/.bash_history
e isso parece resolver o problema de shells interativos . Os shells de logon ainda exibem o mesmo comportamento, com o histórico truncado nas 500
linhas. No entanto, não há HIST
variáveis relacionadas definidas nos arquivos relevantes:
$ for f in /etc/profile ~/.profile ~/.bash_profile ~/.bash_login; do \
echo -ne "$f :"; echo `grep HIST $f`; \
done
/etc/profile :
/home/terdon/.profile :grep: /home/terdon/.profile: No such file or directory
/home/terdon/.bash_profile :grep: /home/terdon/.bash_profile: No such file or directory
/home/terdon/.bash_login :grep: /home/terdon/.bash_login: No such file or directory
$ grep -r HIST /etc/profile.d/ <-- returns nothing
Então, por que é a criação HISTSIZE
e HISTFILESIZE
no ~/.bashrc
não é suficiente, a menos que explicitamente definir o $HISTFILE
para algo diferente do padrão ~/.bash_history
?
history
comando, a saída que você vê é idêntica à que você vê, executandocat .bash_history
, além dos números de linha? Quero dizer, ohistory
comando lista os carimbos de hora ou outras informações? A razão pela qual estou perguntando é: se você vê essas coisas esotéricas, significa que há outro módulo / função / programa, que está mexendo com o histórico do shell e uma versão errada ou com erros do que quer que seja, pode estar causando sofrimento. .;)
: tente outro arquivo como HISTFILE, não o padrão~/.bash_history
. Explicação muito construída: Eu assumo que bash é seu shell padrão, portanto, ao iniciar o sistema, um shell não interativo é o pai da sua sessão X (eu também presumo que você use X), que não saberá nada sobre a opção histappend (como .bashrc é apenas lido por shells interativos), desde que esse shell pai funcione, tudo está bem, mas após o término (ou seja, parada do sistema), ele substitui~/.bash_history
(que é o padrão) e atrapalha o seu histórico ...Respostas:
O problema realmente se resume ao comportamento diferente dos shells de login e não-login. Eu havia definido as variáveis que controlam o histórico no meu
~/.bahsrc
. Este arquivo não é lido quando se inicia um shell de logon, é lido apenas por shells interativos e sem logon (deman bash
):Portanto, toda vez que eu
.history
fazia login, reduzia para um tty ou usava ssh, o arquivo ficava truncado porque eu também não havia definido o tamanho certo~/.profile
. Eu finalmente percebi isso e simplesmente coloquei as variáveis~/.profile
onde elas pertencem , em vez de~/.bashrc
Portanto, a razão pela qual eu
~/.history
estava sendo truncado foi porque eu havia definido apenas as variáveis HISTORY em um arquivo lido por shells interativos e sem login e, portanto, toda vez que eu executava um tipo diferente de shell, as variáveis eram ignoradas e o arquivo cortado. adequadamente.fonte
.bashrc
não é lido por (shells de login OU não interativos).export BASH_ENV=~/.bashrc ; if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
... e na parte superior do ~ / .bashrc, marque para verificar se você realmente está executando interativamente:[ -z "$PS1" ] && return
... Claro, é apenas um idioma.BASH_ENV
não é relevante, afeta apenas shells não interativos. Quanto ao "idioma", é algo que o Debian iniciou e com o qual eu pessoalmente não concordo. Muitas vezes tenho opções gráficas (xset
e similares) no meu .bashrc e não as quero ativas quando executo shells de login de um tty ou através delessh
. Eu quero o meu profile e .bashrc separar. Muitos (embora não todos) os gerenciadores de login originam .profile quando você faz login, para que as variáveis globais sejam definidas melhor onde serão lidas apenas uma vez e não sempre que você abrir um terminal.~/.profile
ou~/.bashrc
) são lidos por último. Tudo o que estiver definido nesses itens terá precedência sobre as configurações globais. Você está certo, não deveria definir essas variáveis/etc/bash.bashrc
. Use~/.profile
(ou~/.bash_profile
) em vez disso.Minha sugestão é usar outro arquivo como
HISTFILE
, não o padrão~/.bash_history
.Embora eu não tenha uma explicação analítica, tentarei descrever o que me levou a essa sugestão: Se você usa
bash
como shell padrão (login) e também usaX
(o que é muito provável), você tem umabash
instância em execução logo após o (gráfico). ) Conecte-se:Eu acho que essa instância é um shell de logon, por isso não lê o seu
~/.bashrc
e, portanto, não sabe nada sobre ahistappend
opção:Enquanto esse "shell pai" for executado, tudo estará bem, mas após o término (ou seja, parada do sistema), ele substituirá
~/.bash_history
(porque esse é o valor padrão) e atrapalha o seu histórico ou o prende no início do sistema para (novamente padrão) 500 linhas. (Ou talvez ambos ...)Também me parece que não é suficiente incluir a configuração do histórico
~/.bashrc
, pois essa não deve ser uma configuração incomum. Não tenho explicação para isso.Com relação ao seu problema, que "Os shells de login ainda exibem o mesmo comportamento", você pode tentar incluir a configuração do histórico também em
~/.bash_profile
:Infelizmente não posso postar uma explicação mais justificada com detalhes da minha própria
bash
configuração, pois sou umzsh
cara ...fonte
~/.bash_profile
resolveu o problema. Agora estou usando~/.bash_history
como meu arquivo de histórico, mas simplesmente adicionei todas as linhas~/.bashrc
mostradas na minha pergunta para~/.bash_profile
. Ainda não tenho certeza de quem estava estragando as conchas interativas, mas parece funcionar agora, obrigado!Como todas as suas configurações estão em ordem, de acordo com a página de manual, e como o arquivo de histórico não é restrito pelo tamanho (bytes), a única explicação possível em que posso pensar. Tem a ver com a forma como a concha morre.
De acordo com a referência online, a saída normal (histórico salvo) ocorre apenas quando o shell recebe o SIGHUP. Realmente não consigo explicar como seu sistema propaga sinais quando reinicializado, mas suspeito que seu shell seja encerrado com SIGKILL ou SIGPWR.
Pode ser porque o seu WM é executado de forma assíncrona (espera) e o emulador de terminal é gerado a partir do WM, onde o bash está, recebe um sinal de força de saída diferente de SIGHUP. Também pode ser que o sistema operacional envie rapidamente o "kill final" a todos os processos antes que o SIGHUP inicial gracioso consiga chegar ao shell via X -> WM -> xterm, possivelmente porque X ou WM leva mais tempo para sair do que é preciso que o sistema operacional esteja pronto para cair.
Estou em águas profundas com essas coisas, mas acho que algo nesse sentido causa o comportamento errático. Eu já tive esse problema antes, e o remédio mais sólido é
exit
no bash, onde você deseja manter a história.Percebi
history -a
na sua pergunta e não consigo pensar por que isso não seria suficiente para preservar a história.Você pode solucionar o problema descobrindo o que realmente mata o seu bash e passando a descobrir onde o sinal se origina e corrigindo o problema lá, ou simplesmente liberar o histórico quando souber qual sinal é o último (supondo que os discos ainda estejam on-line nesse momento) ):
A captura de tela incluída ilustra o que estou falando no segundo e no terceiro parágrafos. A sequência em que eu concordo da esquerda , mato a concha esquerda da direita e gata a história.
festança do homem
referência online
captura de tela demonstrativa
fonte
/tmp/pso
que você está matando? Entendo o seu ponto de vista sobre os diferentes sinais de morte (embora, como você diz, pensei que é isso quehistory -a
existe para lidar). Vou testar isso por um tempo e reportar de volta.Verifique / etc / profile e /etc/profile.d/*
Talvez haja algo mexendo com as configurações de histórico lá.
fonte
grep -r HIST /etc/profile.d/
não retorna nada, e eu já verifiquei/etc/profile
.