História mutilada

15

No modo GUI, quando um usuário tem mais de um terminal aberto, como os terminais reescrevem o arquivo de histórico desse usuário? a razão pela qual pergunto é porque, é bem possível que em cada um dos terminais o usuário acabe executando diferentes comandos. Então, o arquivo histórico acaba salvando os comandos de todos os terminais ou apenas do primeiro a ser aberto? Ou existe algum outro tipo de esquema empregado para lidar com essa situação?

Jay
fonte

Respostas:

11

Depende inteiramente de como o shell escolhe lidar com isso

bashpor padrão, substituirá o arquivo de histórico pelo histórico local de cada shell à medida que ele sai, para que o último shell a sair ganhe. A histappendopção fará com que seja anexado ao histórico principal ( shopt -s histappend).

zsh faz o mesmo por padrão e tem algumas opções para lidar com isso:

  • appendhistory - O histórico de cada shell é anexado ao arquivo de histórico principal quando o shell sai
  • incappendhistory - O arquivo de histórico mestre é atualizado toda vez que uma linha é executada em qualquer shell, em vez de esperar até que o shell saia
  • sharehistory- Como incappendhistory, mas também puxa alterações do arquivo de histórico mestre para todos os shells em execução, para que você possa executar um comando em um shell e, em seguida, clicar Upem outro shell e vê-lo
Michael Mrozek
fonte
Agora me diga como fazer isso em Bash favor;)
tante
1
@tante Não shopt -s histappendfunciona?
Michael Mrozek
0

Originalmente, peguei essa idéia no livro O'Reilly "Unix Power Tools".

No meu .profileconjunto:

export HISTFILE=$HOME/.sh_hist.$$

Sempre que .profileé lido, recebo um novo arquivo de histórico nomeado com o PID da minha sessão. Se eu tiver vários logins, cada login receberá um arquivo de histórico exclusivo. Trabalha em kshe bash.

Se você está apenas abrindo novos terminais em uma sessão X, esses geralmente não são shells de login, mas você pode configurá-los para atuar como shells de login. Por exemplo, rxvt +lsserá iniciado rxvtcomo um shell de logon. Verifique os documentos para qualquer terminal que você esteja usando.

Além disso, a menos que você esteja usando um arquivo .logoutou .bash_logout(ou algum outro meio) para limpar, você eventualmente terá um upload de .sh_histarquivos.

mazianni
fonte
0

tcsh: set savehist = (5000 merge)mescla

user39122
fonte