
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.