estranheza da história do KSH

3

Primeira vez que postar aqui, então fique comigo ...

Estou executando o KSH no RHEL 2.6 no x86. A versão do KSH é:

sh (Pesquisa AT & T) 93u + 2012-08-01

Mudar para Bash ou voltar para o Tcsh (que felizmente usei no meu antigo emprego) não é possível.

A primeira coisa chata que notei sobre o KSH é que, às vezes, meu histórico de terminais diferentes (tenho muitos terminais abertos por vez) ficava misturado ao percorrer o histórico com a tecla para cima. Eu aprendi então que há um único HISTFILE compartilhado por todos os meus terminais. Tudo bem, mas ainda assim esquisito que eles nem sempre estavam se misturando. Eu também notei que o HISTFILE nem sempre foi atualizado imediatamente. Eventualmente eu decidi que o KSH provavelmente estava armazenando em buffer algum histórico de comandos e periodicamente liberando o conteúdo para o HISTFILE. Eu não consegui encontrar esse comportamento documentado em qualquer lugar, mas parece uma explicação razoável.

Eu realmente quero um histórico diferente para cada sessão, então adicionei isso ao meu arquivo .kshrc:

HISTFILE = ~ / .hist. $ (tty | sed 's;. * / ;;')

que deve fornecer um HISTFILE exclusivo por terminal. Isso é ótimo. Mas ... esses HISTFILES parecem periodicamente serem apagados. A maioria dos meus tem um tamanho de arquivo de 0 bytes agora.

Atualização: Os HISTFILEs individuais de todos os meus terminais abertos estão sendo apagados a cada 10 minutos. Como um relógio.

Alguém viu isso antes ???

Obrigado Matt

    
por Matt 22.02.2018 / 18:09

1 resposta

1

Sim, ksh93 grava seu histórico de linha de comando no arquivo, enquanto bash o grava quando o shell é encerrado. Procurando algum código fonte , parece que o buffer do histórico na memória é 4k ( HIST_BSIZE no código), mas não consigo descobrir se ele é liberado quando está cheio ou depois de um certo número de comandos (que podem HIST_MARKSZ está fazendo neste código?).

E sim, muitas sessões interativas compartilham o histórico se usarem a mesma configuração de HISTFILE . Isso está documentado (minha ênfase):

Command Re-entry.

The text of the last HISTSIZE (default 512) commands entered from a terminal device is saved in a history file. The file $HOME/.sh_history is used if the HISTFILE variable is not set or if the file it names is not writable. A shell can access the commands of all interactive shells which use the same named HISTFILE.

O arquivo de histórico será mantido no tamanho especificado em HISTSIZE , mas não será truncado periodicamente conforme você passa. O que está acontecendo para você é, acho , que desde que você use tty para definir um HISTFILE exclusivo para cada sessão do shell interativa, sair e reiniciar sessões interativas pode ou não pegar o "correto "arquivo de histórico dependendo de qual TTY o shell está conectado.

Se um novo TTY (nunca usado com uma sessão anterior) for alocado para uma sessão de shell, seu arquivo de histórico ficará naturalmente vazio.

    
por 22.02.2018 / 21:28