Qual é a diferença entre “history -w” e a ação de fechar uma sessão de shell?

4

Eu fiz alguns testes sobre a história:

  1. Corri history-c e depois terminei sessão. Este histórico limpo para o shell atual.

  2. Eu corri history -c && history -w . Isso apagou tudo.

  3. Eu deletei todo o conteúdo do arquivo de histórico pelo editor vi: $vi ~/.bash_history . E então eu fiz logout. No próximo login, quando eu executei history apenas as linhas ou comandos da última sessão de shell estão lá.

Isso mostra que existem diferenças entre history -w e a ação quando fechamos uma sessão de shell.

O que realmente acontece quando fechamos uma sessão de shell?

Acho que history -w sobrescreve o conteúdo da memória no arquivo de histórico e history -c exclui o conteúdo da memória. Está correto?

    
por Sinoosh 02.10.2016 / 22:09

1 resposta

6

Ao lidar com o histórico do Bash, temos dois tipos:

  1. uma lista de histórico na memória
  2. o arquivo .bash_history no disco

Quando o Bash iniciar (assumindo uma configuração padrão), ele carregará o conteúdo do seu arquivo .bash_history na lista de histórico na memória (depois de truncá-lo para o tamanho configurado, se necessário).

Em seguida, você digita seus comandos, que são anexados à lista de histórico apenas na memória. O arquivo de histórico no seu disco não é tocado.

Sair da sessão Bash regularmente (sem forçá-la a matar ou causar uma falha de alguma forma) por padrão trunca sua lista de histórico na memória para ajustar-se ao tamanho máximo configurado e acrescenta apenas novas entradas da sessão Bash atual (porque A opção histappend está habilitada) para o seu arquivo de histórico no disco, sem excluir as entradas removidas ou adicionar novamente o conteúdo das sessões anteriores.

Quando você executar history -c , limpe a lista completa do histórico na memória, mas isso não afeta o arquivo de histórico no disco.

A execução de history -w grava sua lista de histórico atual na memória para o arquivo de histórico no disco. Ele não acrescenta novas entradas, mas sobrescreve o arquivo completo. Portanto, executar history -c && history -w efetivamente limpa o arquivo de histórico também.

Limpar manualmente seu arquivo de histórico editando-o a partir de uma sessão de Bash em execução não produz o efeito esperado nem exclui permanentemente o histórico inteiro até o momento, porque a lista de histórico na memória que ainda contém todas as entradas antigas do arquivo de histórico permanecerá intacta .

Ao sair da sua sessão de Bash, o arquivo de histórico será reescrito com os dados da lista de histórico. No entanto, como por padrão a opção histappend está habilitada, somente novas entradas da sessão atual de Bash serão gravadas no arquivo, os dados de histórico mais antigos serão descartados. Você teria que executar history -w para salvar a lista completa do histórico em disco.

O que exatamente acontece quando um shell Bash começa e sai pode ser lido em man bash :

HISTORY
       When the -o history option to the set builtin  is  enabled,  the  shell
       provides access to the command history, the list of commands previously
       typed.  The value of the HISTSIZE variable is used  as  the  number  of
       commands to save in a history list.  The text of the last HISTSIZE com‐
       mands (default 500) is saved.  The shell stores  each  command  in  the
       history  list  prior to parameter and variable expansion (see EXPANSION
       above) but after history expansion is performed, subject to the  values
       of the shell variables HISTIGNORE and HISTCONTROL.

       On startup, the history is initialized from the file named by the vari‐
       able HISTFILE (default ~/.bash_history).  The file named by  the  value
       of  HISTFILE  is  truncated,  if necessary, to contain no more than the
       number of lines specified by the value of HISTFILESIZE.   If  HISTFILE‐
       SIZE  is unset, or set to null, a non-numeric value, or a numeric value
       less than zero, the history file is not truncated.   When  the  history
       file  is  read, lines beginning with the history comment character fol‐
       lowed immediately by a digit are interpreted as timestamps for the pre‐
       ceding history line.  These timestamps are optionally displayed depend‐
       ing on the value of the HISTTIMEFORMAT variable.   When  a  shell  with
       history  enabled  exits,  the  last $HISTSIZE lines are copied from the
       history list to $HISTFILE.  If the histappend shell option  is  enabled
       (see  the description of shopt under SHELL BUILTIN COMMANDS below), the
       lines are appended to the history file, otherwise the history  file  is
       overwritten.   If  HISTFILE  is  unset,  or  if  the  history  file  is
       unwritable, the history is not saved.  If the  HISTTIMEFORMAT  variable
       is  set,  time  stamps are written to the history file, marked with the
       history comment character, so they may be preserved across  shell  ses‐
       sions.   This  uses  the history comment character to distinguish time‐
       stamps from other history lines.  After saving the history, the history
       file is truncated to contain no more than HISTFILESIZE lines.  If HIST‐
       FILESIZE is unset, or set to null, a non-numeric value,  or  a  numeric
       value less than zero, the history file is not truncated.
    
por Byte Commander 02.10.2016 / 22:57