A tela GNU perde (partes de) históricos de comandos

5

Eu uso GNU screen com 5 sessões diferentes, cada uma armazenando seu próprio histórico de comandos. Mas muitas vezes eu não encontro um comando na história, embora eu tenha certeza que o usei exatamente na sessão em que estou atualmente, algumas semanas atrás.

Parece que há um limite rígido no tamanho do histórico? Como posso definir isso para o infinito?

Uma pergunta relacionada: Como posso controlar onde o histórico de uma sessão é armazenado? Muitas vezes, nosso sysadmin reinicia o (s) computador (es) e eu perco todas as minhas sessões, e eu tenho que fazer screen -wipe porque as sessões estão corrompidas. Então, todas as histórias se foram. :( Eu gostaria de encontrar os históricos armazenados nesse caso e ligá-los em uma sessão recém-criada.

P.S .: eu uso bash em todas as sessões de tela.

UPDATE : não estou perguntando sobre como unificar os históricos da sessão. Só quero que cada sessão tenha um histórico infinito e quero poder "carregar" esse histórico em uma nova sessão, caso o antigo seja corrompido ou excluído.

UPDATE 2 : Você provavelmente já descobriu: Quando eu disse eu uso GNU screen com 5 sessões diferentes eu realmente quis dizer uma sessão GNU screen com 5 sessões diferentes janelas nele. Desculpe.

    
por user9474 06.12.2009 / 19:25

4 respostas

6

Seria melhor você usar o histórico do Bash do que o da tela. A tela mantém um buffer de rolagem (provavelmente na memória, e não em um arquivo). Quando você se lembra de comandos usando Ctrl - a { está realmente vasculhando tudo o que apareceu na tela que ainda está no buffer que parece seguir um caractere pronto. Não há realmente um histórico de comandos. Você pode aumentar o tamanho do buffer de rolagem usando os comandos screen -h num ou defscrollback num ou scrollback num , por sinal.

Você pode usar a sugestão de warren para manter seu histórico de Bash atualizado. E / ou você pode usar uma das minhas funções de log encontradas aqui que podem salvar seu endereço IP ou ID de sessão de tela, juntamente com a data, a hora, o diretório de trabalho atual e o comando real. Eu uso isso o tempo todo eu mesmo. Você pode ter que definir a variável $hcmntextra , que é usada por minhas funções, para incluir $STY para que o nome da sessão da tela seja registrado também.

    
por 06.12.2009 / 20:47
4

Eu fiz uma pergunta semelhante na SU há pouco: link

Para citar a resposta aceita :

aqui estão duas coisas que você precisa fazer:

Insira o comando shopt -s histappend no seu .bashrc. Isso será anexado ao arquivo de histórico em vez de sobrescrevê-lo.
Também no seu .bashrc , insira PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n" e o arquivo de histórico será reescrito e re-lido toda vez que o bash mostrar o prompt.

Veja também as páginas do manual history .

    
por 06.12.2009 / 19:37
2

Minha solução preferida para esse problema é uma variação de uma das respostas anteriores.

Eu gosto de ter um arquivo separado armazenado para cada combinação de sessão / janela de tela e cada arquivo é anexado a cada vez que o prompt correspondente é mostrado:

if [[ "$STY" = "" ]]; then STY="none"; fi
if [[ "$WINDOW" = "" ]]; then WINDOW="none"; fi
export HISTFILE=~/.bash_history.$STY.$WINDOW;


PROMPT_COMMAND="$PROMPT_COMMAND; history -a"

Isso cria os seguintes arquivos de histórico:

.bash_history.none.none
.bash_history.2756.pts-9.linux.0
.bash_history.2756.pts-9.linux.1
.bash_history.2881.pts-9.linux.0

Se você quiser que a janela {x} sempre use seu próprio arquivo de histórico, mas use o mesmo arquivo, independentemente da sessão de tela, você pode simplesmente deixar de fora as variáveis STY:

if [[ "$WINDOW" = "" ]]; then WINDOW="none"; fi
export HISTFILE=~/.bash_history.$WINDOW;


PROMPT_COMMAND="$PROMPT_COMMAND; history -a"

Isso criaria os seguintes arquivos de histórico:

.bash_history.none
.bash_history.0
.bash_history.1
.bash_history.2
    
por 28.09.2012 / 21:24
1

Os históricos de comandos para cada janela estão na memória para cada sessão bash. Você teria que escrever bash para arquivos de histórico diferentes para que eles persistissem e permanecessem separados como você está perguntando.

Você pode fazer isso definindo HISTFILE por sessão de tela. Eu imagino que a maneira de fazer isso seria algo assim em seu arquivo de inicialização:

if [[ "$WINDOW" != "" ]] ; then export HISTFILE=~/.bash_history.$WINDOW ; fi

Observe que isso não resolve o problema de atualizar o arquivo de histórico quando seus shells são finalizados por uma reinicialização.

    
por 07.12.2009 / 01:29