Histórico do Bash não preservado entre sessões de terminal no Mac


33

Minha história do bash misteriosamente parou de funcionar e não tenho idéia de como corrigi-lo. É assim que meu .bashrc se parece:

HISTSIZE=500
HISTFILESIZE=500
HISTFILE=$HOME/.bash_history

No entanto, quando eu corro, echo $HISTFILEele é impresso /Users/myusername/.bash_sessions/EE8689E5-7DAD-4018-817E-0AF1DE36082A.historynew.

Como sou o proprietário do arquivo .bash_history, não tenho muita certeza de como resolveria esse problema.

Obrigado!


Olá Nelson, seja bem-vindo ao Super Usuário. Verificação rápida dos espaços inseridos por você?
bertieb

sim, foram removidos e relatados.

@bertieb, removi os espaços e agora $ HISTFILESIZE está sendo ecoado corretamente. No entanto, o histórico permanece não salvo e $ HISTFILE imprime esse arquivo de histórico temporário ímpar (que estou assumindo que armazena o histórico apenas para essa sessão).

Você está tentando mudar $HISTFILE, por interesse? Eu não tenho um .bashrcOSX e echo $HISTFILErelata o lugar que eu esperaria - comentar as linhas em questão tem algum efeito?
bertieb

1
Sempre citar expansões variáveis caminho: HISTFILE="$HOME/.bash_history”. Sem as aspas, sua versão será inválida se o caminho para o diretório inicial contiver espaços (ou possivelmente outros caracteres especiais).
Chris Página

Respostas:


26

O Terminal atribui a cada sessão do terminal um identificador exclusivo e o comunica por meio da variável de ambiente TERM_SESSION_ID, para que os programas em execução em um terminal possam salvar / restaurar o estado específico do aplicativo ao sair e reiniciar o Terminal com o Resume ativado.

Uma nova pasta (~ / .bash_sessions /) é usada para armazenar os arquivos HISTFILE e .session que são exclusivos das sessões.

Durante a inicialização do shell, o arquivo da sessão é executado. Arquivos antigos são excluídos periodicamente.

O comportamento padrão organiza para salvar e restaurar o histórico do comando bash independentemente para cada sessão de terminal restaurada. Ele também mescla comandos no histórico global para novas sessões.

Você pode desativar esse comportamento e compartilhar um único histórico definindo

export SHELL_SESSION_HISTORY=0

Se HISTTIMEFORMAT estiver definido, o histórico por sessão será desativado por padrão (leia mais em / private / etc / bashrc_Apple_Terminal)

O mecanismo de salvar / restaurar será desativado se o seguinte arquivo existir:

~/.bash_sessions_disable

A Apple já mudou algum comportamento desde o lançamento do El Capitan, por isso é melhor ler mais sobre isso aqui less /private/etc/bashrc_Apple_Terminal


3
Mas não comece desativando o mecanismo de salvar / restaurar. Se você estiver tendo problemas com o histórico de comandos do shell, tente resolver esse problema. O ~/.bash_sessions_disablearquivo deve ser usado como último recurso, caso haja um problema que não possa ser resolvido especificamente. Ele desativa mais do que apenas o histórico de comandos por sessão e é possível desativar apenas o histórico de comandos por sessão. Veja os comentários em /etc/bashrc_Apple_Terminalpara detalhes.
Chris Página

1
@ Chrishrage Na verdade, a Apple alterou alguns bits de script. Resposta atualizada, obrigado.
diimdeep

@diimdeep Onde eu acrescentaria esta linha? export SHELL_SESSION_HISTORY=0
Zerohedge 14/05

@zerohedge .bashrce .bash_profile unix.stackexchange.com/a/310150/15362
diimdeep

@diimdeep Obrigado. Isso parece estar funcionando agora. Tem alguma ramificação?
Zerohedge 14/05

6

Notei algo semelhante após a atualização do El Capitan. A simples adição do arquivo .bash_sessions_disableno diretório inicial desativa as novas sessões do bash e .bash_historyvolta a ser usada.

Este tópico do Reddit tem mais informações e mais links.


Mas não comece desativando o mecanismo de salvar / restaurar. Se você estiver tendo problemas com o histórico de comandos do shell, tente resolver esse problema. O ~/.bash_sessions_disablearquivo deve ser usado como último recurso, caso haja um problema que não possa ser resolvido especificamente. Ele desativa mais do que apenas o histórico de comandos por sessão e é possível desativar apenas o histórico de comandos por sessão. Veja os comentários em /etc/bashrc_Apple_Terminalpara detalhes.
Chris Página

Obrigado Chris - o que mais ele desabilita? Meu histórico tem funcionado conforme o esperado (igual à versão anterior do osx e igual ao linux) nos últimos dois meses. Não sabe por que eles mudaram?
rabs

@rabs eu sugiro adicionar SHELL_SESSION_HISTORY=0no topo ~/.bash_profile.
Teejay

5

Você pode resolver o problema do RVM atualizando para a versão mais recente do RVM ou executando o seguinte:

  echo 'shell_session_update' > $HOME/.bash_logout

Consulte https://github.com/rvm/rvm/issues/3540 para obter mais informações.


1
Correção agradável, sem ter que modificar o rvm.
mlo55

1
Estamos falando do RVM (Ruby enVironment Manager) rvm.io ?? Quando e por que isso deveria se envolver?
MarkHu 3/06

3

Esta resposta do tópico do Reddit me salvou:

Provavelmente o RVM está impedindo a saída "hook" para que o bash_sessions seja executado. Se você comentar a seguinte linha no seu .bash_profile, ela deverá funcionar.

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

Isso realmente ajudou!
Karsten

1

Se for um Mac, suponho que seja o shell de login padrão bashe seja executado em .profilevez de .bashrc. Então, você estava editando o arquivo errado.


Eu editei .profile para que seja igual ao meu .bashrc, e o histórico ainda não aparece.

@NelsonLiu O que acontece quando você ecoa $HISTFILEem diferentes partes profile? Talvez você tenha outro script que altere a variável? Eu verifiquei ambos Terminale iTerm, bash 3e 4 ambos têm o padrão $HOME/.bash_history.
Theoden

como eu ecoaria $ HISTFILE em diferentes partes do perfil?

@NelsonLiu, não é óbvio? seu objetivo é rastrear quando isso $HISTFILEmuda. Assim, basta fazer dois echo $HISTFILEcercarem seu código. O que você precisa fazer é encontrar o trecho de código onde as $HISTFILEalterações mudam, movendo as duas echo $HISTFILElinhas cada vez mais perto uma da outra, linha por linha, até que algo seja revelado. Isso é tudo.
theoden

1
então eu fiz como você instruiu e fez .bash_profile o mesmo que profile. Eu decidi echo $HISTFILEem todas as linhas, apenas para ver se havia alguma diferença. No entanto, apenas imprimiu /Users/username/.bash_historyinúmeras vezes. Eu então corri echo $HISTFILEno shell, e ele saiu /Users/nelsonliu/.bash_sessions/CD275A29-1DF1-4ED8-B8CE-F706B11B812F.historynew.

0

Eu estava vendo esse problema em High Sierra. De alguma forma, o meu.

Não havia nenhuma conseqüência nesse arquivo .bash_history, então fiz um sudo rm .bash_history seguido de um toque em .bash_history para criar um novo.

Tudo parece bem agora


Para mim, não eram as permissões de arquivo, era que eu não havia definido nenhuma das variáveis ​​de controle HIST. Aparentemente, um ou mais deles devem ser definidos. ~/.bash_profileexport HISTTIMEFORMAT='%F %T '
Adicionei
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.