Por que o padrão bash parece não ter alguns dos comandos que usei na história, mas tem outros?

3

Em um Mac, Sierra.

Não tenho configurações relacionadas com HIST que eu possa ver:

~ @ Magni (jcollum) 
$ env|grep HIST

~ @ Magni (jcollum) 
$ cat ~/.bash_profile | grep HIST

~ @ Magni (jcollum) 

Mas tenho coisas na minha história que fiz ontem e que não estão lá depois de um reinício. Realmente realmente duvido que eu coloque espaços antes do comando toda vez que eu fiz isso.

Eu sei que há posts aqui que me dizem como consertá-lo, mas eu gostaria de saber por que isso acontece dessa maneira.

Por exemplo, quando eu faço um grep por curl que eu rodei ontem, nada:

~ @ Magni (jcollum) 
$ history | grep curl 
166  curl -X POST -d [email protected] -d password=********** http://localhost:3000/login
503  hg curl 
519  history | grep curl 

400 comandos atrás? Eu sei que usei curl uma dúzia de vezes na semana passada, mas (e eu não uso bash o suficiente para ter centenas de comandos esta semana).

Basicamente, estou perplexo e não sei porque está faltando muito do que fiz. É possível que a história esteja apenas sendo gravada a partir de uma instância bash?

    
por jcollum 26.05.2017 / 23:45

1 resposta

4

Is it possible that history is only being recorded from one bash instance?

Isso é o tipo de coisa que está acontecendo. A maneira como o history funciona no bash, a menos que você tenha feito alguns ajustes para alterá-lo, é:

  • Quando o bash é iniciado, ele carrega o histórico salvo do arquivo de histórico.
  • Cada vez que um comando é executado, ele é adicionado ao histórico na memória de bash.
  • Quando o bash sai, ele salva o histórico acumulado no arquivo de histórico.

Agora, suponha que você inicie duas instâncias do bash. Ambos carregam o arquivo de histórico quando iniciam. Ambos adicionam os comandos que eles executam ao seu próprio histórico. Quando uma instância sai, ela salva o histórico antigo mais seus próprios comandos no arquivo de histórico. Quando a segunda instância sai, ela salvou o histórico antigo mais o próprio seu comando no arquivo histórico - e, ao fazer isso, limpa o histórico da primeira instância que saiu.

O mecanismo de economia de histórico do Bash é excessivamente simplista. Suas linhas de histórico estão à mercê de todas as outras instâncias em execução - a última saída limpa a história dos outros. As soluções incluem acrescentar o novo histórico ao arquivo de histórico em vez de sobrescrever o arquivo de histórico com todo o histórico da memória ou anexar linhas ao arquivo de histórico assim que elas forem executadas. Veja Preserve o histórico bash em várias janelas de terminal e Preserve o histórico bash em várias janelas de terminal para algumas formas de implementar este e outros variantes.

A solução mais simples é executar o zsh, que salva o histórico de maneira sã por padrão. Eu recomendo isso, especialmente desde que você está executando o macOS, que está preso em uma versão antiga do bash porque a Apple não gosta da licença de versões lançadas desde 2009.

    
por 28.05.2017 / 03:12