Comportamento histórico do bash estranho ao executar várias sessões

15

Como o histórico da linha de comando é armazenado quando uso várias janelas de terminal? Eu sei que é armazenado em .bash_history , mas não consigo ver a lógica em qual histórico é usado se eu abrir uma nova janela. Quase parece não determinístico, de certo modo, que eu nunca sei que comando verei se tentar usar a seta em uma nova janela.

Alguém pode explicar isso?

Existe uma maneira de controlar o histórico de tal forma que eu possa reutilizar o histórico de uma determinada janela?

    
por Alex Gitelman 02.12.2011 / 19:38

3 respostas

14

Para entender o comportamento do histórico bash primeiro você precisa saber o seguinte:

  1. Há o histórico no arquivo de histórico.
  2. Existe o histórico na memória de um processo bash.
  3. O histórico na memória de um processo bash não é sincronizado com o histórico na memória de qualquer outro processo bash.
  4. O histórico na memória de um processo bash não é sincronizado com o histórico no arquivo, a menos que solicitado explicitamente ou durante algum evento específico (veja abaixo).

Usando as configurações padrão, o ciclo de vida de uma sessão bash em relação ao histórico é o seguinte:

  1. Durante o bash de inicialização, o arquivo de histórico será lido. O conteúdo do arquivo de histórico está agora na memória do processo bash.
  2. Durante o uso normal, apenas o histórico na memória é manipulado.
  3. Durante o desligamento, o histórico na memória é gravado no arquivo de histórico, sobrescrevendo qualquer conteúdo anterior do arquivo de histórico.

O comportamento aparentemente não determinístico que você observou é principalmente porque o conteúdo do arquivo de histórico é sempre o histórico da última sessão bash fechada, e o bash apenas lê o arquivo de histórico durante a inicialização.

Leia o manual do bash para uma explicação mais detalhada do processo de inicialização e desligamento.

Observe que, com as configurações padrão, quero dizer as configurações padrão do bash. Sua distribuição pode ter fornecido um .bashrc (ou /etc/bash.bashrc ) que altera esse comportamento.

Ao ativar a opção histappend do shell, você pode dizer ao bash para anexar em vez de sobrescrever o arquivo de histórico. Você pode ativar histappend usando o comando shopt -s histappend . Para ter essa opção sempre ativada, você precisa colocar o comando no seu .bashrc (ou outro arquivo de inicialização). Leia mais sobre o comando shopt no manual do bash

Observe que ativar histappend não reduzirá muito o comportamento aparentemente não determinístico. Isso ocorre porque cada sessão bash ainda tem seu próprio histórico na memória. É possível ter um histórico de bash principalmente sincronizado. Há um guia sobre como fazer com que cada processo do bash tenha um histórico sincronizado principalmente em um encadeamento no estouro de pilha .

usando o comando incorporado history você pode dizer explicitamente ao bash para ler o histórico do arquivo para a memória, ou escrever da memória para o arquivo. Por exemplo: history -r lerá o conteúdo do arquivo e o anexará ao histórico na memória. history -w irá gravar o histórico atual da memória para o arquivo, sobrescrevendo o conteúdo anterior. Isso é basicamente o que acontece durante o desligamento. Leia mais sobre o comando history no manual do bash

Para completar, aqui está uma lista das variáveis internas que modificam o comportamento do histórico:

  • HISTFILE : o arquivo para ler e gravar o histórico em.
  • HISTFILESIZE : a contagem máxima de linhas para o arquivo de histórico.
  • HISTSIZE : a contagem máxima de linhas para o histórico na memória.
  • HISTCONTROL , HISTIGNORE , HISTTIMEFORMAT : não relevante para esta discussão. Leia o manual do bash para obter detalhes.
por 02.12.2011 / 20:31
2

link

Você pode manipular como o arquivo de histórico é gravado com um dos terminais, ou seja, executar "histórico -a" ou "histórico -w" no terminal que deseja salvar o histórico e, em seguida, "histórico - r "nos outros terminais. Depende do que você quer fazer.

    
por 02.12.2011 / 20:03
0

AFAIK, os comandos bash são salvos depois que a sessão SSH é finalizada. Portanto, os comandos não são salvos quando uma sessão termina anormalmente (por exemplo, devido a uma falha de rede). Eu estou falando aqui sobre as sessões do SSH. Os terminais locais podem usar abordagem semelhante.

Ao abrir várias sessões ao mesmo tempo, os comandos digitados em uma sessão não são vistos na outra enquanto estão ativos. No entanto, você verá esses comandos quando terminar sua sessão reabrir.

    
por 02.12.2011 / 19:52