Remoção duplicada de sessão cruzada no histórico de comandos do bash

2

O contexto do problema:

  • sempre ativo ignoreboth e erasedups
  • HIST_SIZE e FILESIZE com os limites desejados / práticos das linhas do histórico diferentes para o nosso usuário
  • quase sempre tem várias sessões paralelas e (geralmente) sessões aninhadas¹

Comportamento esperado:

  • depois de fechar qualquer sessão e reabrir outro (s), não deve haver duplicatas no histórico de qualquer sessão.

  • não precisamos fechar todas as sessões antes de abrir outra

  • Os históricos das sessões ativas não devem ser afetados por outras sessões em execução / fechadas (para que a opção para um único histórico para todos não seja uma solução)

  • novas sessões, por outro lado, devem (naturalmente) ter linhas de histórico de todas as seções fechadas antes da hora de abrir (mas sem dups, é claro)

Comportamento:

  1. Inicie uma sessão sem outras sessões paralelas em alguma máquina

  2. Suponha um histórico salvo ² com as últimas três linhas:

    ./reference-point  # anything, just to use as a reference
    ls
    la
    ll
    
  3. Inicie uma sessão aninhada (ssh ou até mesmo um comando bash, também para ser mantido no histórico). Eu farei um simples:

    ssh machine
    
  4. Faça 3 comandos, pelo menos uma vez cada, e em uma ordem possivelmente diferente. Por exemplo:

    ll
    ls
    la
    ll
    
  5. Nossas últimas 4 linhas devem ser:

    ./reference-point  # anything, just so we know
    ls
    la
    ll
    
  6. Agora fechamos esta sessão (com CTRL + D ou qualquer coisa que não seja mantida no histórico). Agora, na nossa primeira sessão, nossas 5 últimas linhas devem ser:

    ./reference-point  # anything, just so we know
    ls
    la
    ll
    ssh machine
    
  7. Feche esta sessão (que é a única sessão ativa agora)

  8. Inicie outra sessão e verifique as últimas 10 linhas do histórico:

    ./reference-point  # anything, just so we know
    ls
    la
    ll
    ls
    la
    ll
    ssh machine
    

Este exemplo faz com que os dups históricos fiquem próximos uns dos outros. Mas os usos práticos, claro, não fariam. O efeito colateral ruim é que o tamanho do histórico não pode ser adivinhado a partir da configuração que podemos usar. Além disso, o comportamento está claramente errado.

O que posso fazer para resolvê-lo, ou (pelo menos) lidar gentilmente melhor com esse problema, além de aumentar muito mais do que eu queria que minha configuração "HIST * SIZE"?

Algumas notas que gostaria de fazer:

Esse bug é muito antigo e não conheço ninguém que tenha uma solução real para ele. E, no meu caso específico, pode haver problemas ou pequenas "capturas" com algumas soluções fornecidas na Web.

Este problema foi relatado em Savannah em 2014 . Mas parece que ninguém até leu até hoje. Você pode verificar isso (e, talvez, até mesmo fazer algum comentário útil lá, já que é um lugar oficial para o Bash).

-

¹ sessões aninhadas são necessárias para mim e devem ser muito comuns. Por exemplo: ssh para máquina de acesso de rede fechada, e após esse login novamente para uma ou mais máquinas (em sessões paralelas, também comuns)

² para verificar as linhas do histórico sem afetar os comandos mantidos, você pode usar 'ignoreboth' Bash config e apenas fazer um "histórico 10" (anote o espaço antes do comando!) ou similar. Eu usei isso para fazer o teste enquanto escrevia esta pergunta.

    
por Balaco 02.06.2015 / 03:20

0 respostas