Por que o histórico de comandos só é salvo na saída

Por que o histórico de comandos só é salvo na saída

Estou tentando salvar um arquivo de histórico diferente por guia/terminal, mas não consigo salvá-lo imediatamente após a execução de um comando. O histórico é salvo quando executo "exit".

Isso é um problema porque o que quero conseguir é ter uma cópia do histórico caso o terminal ou o computador trave.

Depois de pesquisar na Internet, é isso que tenho no meu arquivo .bashrc:

export HISTFILE="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND=$(history -a; $PROMPT_COMMAND)

Alguma ideia do que estou fazendo de errado?

Obrigado.

Responder1

Você está atribuindo PROMPT_COMMAND incorretamente. Quando você escreve

PROMPT_COMMAND=$(history -a; $PROMPT_COMMAND)

Você está executando 'history -a' (que não produz saída) e, em seguida, executando $PROMPT_COMMAND (que durante os scripts de inicialização pode estar vazio) e atribuindo a saída desses dois comandos (a string vazia) a PROMPT_COMMAND. O que você quer é apenas:

PROMPT_COMMAND='history -a'

Se você quiser anexá-lo a um comando existente atualmente, faça

PROMPT_COMMAND+="history -a${PROMPT_COMMAND+=; }$PROMPT_COMMAND"

Responder2

Por alguma razão que não consigo entender, isso funciona:

export HISTFILE_NEW="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND="history -w $HISTFILE_NEW; $PROMPT_COMMAND"

Embora isso, não

export HISTFILE="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

Claro, a primeira solução é mais lenta que a teoricamente boa (a segunda) porque todo o histórico é salvo toda vez que um novo comando é escrito.

Portanto, se alguém souber POR QUE isso acontece e como isso poderia ser resolvido, ficaria muito grato.

Responder3

Respondendo à intenção, em vez da pergunta literal:

Veja como usar o script. Isso lhe dará comandos e suas saídas. Observe que isso não é uma panacéia, pois qualquer comando que use o posicionamento do cursor será difícil de decifrar posteriormente.

Script de nome - faça o texto digitado da sessão do terminal

Script de sinopse [-a] [-c COMMAND] [-f] [-q] [-t] [arquivo]

Descrição O script faz um texto datilografado de tudo que é impresso em seu terminal. É útil para alunos que precisam de um registro impresso de uma sessão interativa como prova de uma tarefa, pois o arquivo datilografado pode ser impresso posteriormente com lpr(1).

Se o arquivo de argumentos for fornecido, o script salva todos os diálogos no arquivo. Se nenhum nome de arquivo for fornecido, o TypeScript será salvo no arquivo TypeScript.

Opções:

  -a'        Append the output to file or typescript, retaining the priorcontents.

-c COMMAND Execute o COMMAND em vez de um shell interativo. Isso torna mais fácil para um script capturar a saída de um programa que se comporta de maneira diferente quando seu stdout não é um tty. -f' Libera a saída após cada gravação. Isso é bom para a telecooperação: uma pessoa faz 'mkfifo foo; script -f foo' e outro pode supervisionar em tempo real o que está sendo feito usando 'cat foo'.

-q'Fique quieto.

-t' Gera dados de temporização para erro padrão. Esses dados contêm dois campos, separados por um espaço. O primeiro campo indica quanto tempo decorreu desde a saída anterior. O segundo campo indica quantos caracteres foram gerados desta vez. Essas informações podem ser usadas para reproduzir textos datilografados com digitação realista e atrasos de saída.

O script termina quando o shell bifurcado sai (um control-D para sair do shell Bourne (sh(1)) e sai, efetua logout ou control-d (se ignoreeof não estiver definido) para o shell C, csh(1) ).

Certos comandos interativos, como vi(1), criam lixo no arquivo TypeScript. O script funciona melhor com comandos que não manipulam a tela; os resultados destinam-se a emular um terminal impresso. ...

Pesquise "man script" no Google. Se você tiver um sistema operacional específico, inclua-o. Esta é a versão Linux, mas existem versões quase idênticas para *BSD, Mac. Provavelmente as portas do Windows também estão disponíveis.

informação relacionada