Quais são os casos em que o comando digitado é perdido do histórico?

1

Eu digitei um monte de comandos e quando eu corri history eu vi que eles não estavam presentes lá.

Além do caso quando o comando começa com (espaço), quais são os casos em que os comandos não serão registrados no histórico?

    
por Eduard Florinescu 18.09.2017 / 14:11

2 respostas

2

Você já mencionou o espaço principal e outra resposta mencionou configurações que <\> <\> alterarão intencionalmente o que foi salvo no histórico, como a configuração HISTIGNORE e simplesmente desativando o histórico .

Outro cenário é vários shells interativos executados pelo mesmo usuário. O shell Z possui uma opção share_history que possibilita que mais de uma instância do shell Z atualize um arquivo de histórico compartilhado. Ele relê o arquivo procurando novas entradas e aplica registros de data e hora a cada entrada.

O shell Bourne Again não tem este built-in (embora isso possa tipo de fazê-lo usando shenanighans para executar comandos quando o prompt é impresso). O comportamento do arquivo de histórico padrão que isso está alterando é que nenhum shell espera que algo diferente de si mesmo esteja gravando no arquivo de histórico e não atualiza o histórico após cada linha de comando executada.

O comportamento padrão no shell Bourne Again, especificamente, apenas atualiza o arquivo de histórico quando o shell sai ou um explicitamente diz para ele com o comando history . Isso significa que não apenas um shell simplesmente sobrescreverá o histórico gravado por outro quando um usuário tiver várias sessões de shell interativas; mas também que é possível que um shell que não seja terminado cleanly não grave o arquivo de histórico e, portanto, perca o histórico de comando que ocorreu entre o shell ser terminado de forma não limpa e sua última atualização (explícita) o arquivo de histórico.

Leitura adicional

por 18.09.2017 / 17:22
1

O histórico é controlado principalmente por parâmetros de shell.

HISTCONTROL

HISTCONTROL é um desses parâmetros.

Aqui está o que man bash diz:

HISTCONTROL
     A  colon-separated  list of values controlling how commands are
     saved on the history list.  If  the  list  of  values  includes
     ignorespace,  lines  which begin with a space character are not
     saved in the history list.  A value of ignoredups causes  lines
     matching  the  previous history entry to not be saved.  A value
     of ignoreboth is shorthand for ignorespace and  ignoredups.   A
     value  of erasedups causes all previous lines matching the cur‐
     rent line to be removed from the history list before that  line
     is  saved.   Any  value  not  in the above list is ignored.  If
     HISTCONTROL is unset, or does not include a  valid  value,  all
     lines  read  by the shell parser are saved on the history list,
     subject to the value of HISTIGNORE.  The second and  subsequent
     lines  of a multi-line compound command are not tested, and are
     added to the history regardless of the value of HISTCONTROL.

Digite echo $HISTCONTROL para ver como está definido para você.

  • ignorados - ignoram os mesmos comandos após um ao outro
  • ignorespace - ignora os comandos que começam com o espaço como você disse
  • ignoreboth - ambos acima
  • erasedups - exclui comandos antigos quando eles são usados novamente

Meu palpite é que você tem erasedups habilitado e os comandos estão faltando, porque eles foram reutilizados em um momento posterior.

HISTIGNORE

Também é possível proibir completamente que certos comandos ou padrões apareçam no histórico.

Digite echo $HISTIGNORE para ver quais são banidos para você. A lista de padrões é separada por dois pontos : . Também é possível banir um padrão como history* que baniria todos os comandos que começam com o histórico de palavras.

Histórico de deficiências

Além disso, o histórico pode ser desativado .

Se nenhum desses casos se aplicar a você, você poderá esclarecer sua dúvida adicionando uma sequência de comandos não totalmente preservada no histórico.

    
por 18.09.2017 / 14:33