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

0

Estou tentando salvar um arquivo de histórico diferente por guia / terminal, mas não consigo salvá-lo imediatamente depois que um comando é executado. A história acabou de ser salva quando eu corro "sair".

Este é um problema, pois o que eu quero alcançar é ter uma cópia do histórico, caso o terminal ou o computador falhe.

Depois de procurar pela internet, isso é o que eu 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 errado?

Obrigado.

    
por Fidel 04.08.2018 / 13:19

3 respostas

1

Por algum motivo 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"

Enquanto isso, não faz

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 que a primeira solução é mais lenta do que a teoricamente boa (a segunda), porque toda a história é salva toda vez que um novo comando é escrito.

Portanto, se alguém souber por que este é o caso e como isso poderia ser resolvido, eu ficaria muito grato.

    
por 06.08.2018 / 15:11
3

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 seus 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 no momento, faça

PROMPT_COMMAND+="history -a${PROMPT_COMMAND+=; }$PROMPT_COMMAND"
    
por 04.08.2018 / 16:19
1

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

Veja o uso do script. Isso lhe dará comandos e sua saída. Observe que isso não é uma panacéia, pois qualquer comando que use o posicionamento do cursor é difícil de decifrar mais tarde.

Nome script - faça o typescript da sessão de terminal

Sinopse script [-a] [-c COMMAND] [-f] [-q] [-t] [arquivo]

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

Se o arquivo de argumento for fornecido, o script salvará todo o diálogo no arquivo. Se nenhum nome de arquivo for fornecido, o texto digitado será salvo no arquivo digitado.

Opções:

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

-c COMMAND Execute o comando 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 'Dados de tempo de saída para erro padrão. Esses dados contêm dois campos, separados por um espaço. O primeiro campo indica quanto tempo passou desde a saída anterior. O segundo campo indica quantos caracteres foram emitidos desta vez. Essas informações podem ser usadas para reproduzir os textos digitados 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 sair, sair ou controlar-d (se ignoreeof não estiver definido) para o C-shell, csh (1)).

Certos comandos interativos, como o vi (1), criam lixo no arquivo typescript. Script funciona melhor com comandos que não manipulam a tela, os resultados são feitos para emular um terminal de cópia impressa. ...

Procure "man script" no google. Se você tem um sistema operacional específico, inclua isso. Esta é a versão linux, mas existem versões idênticas para * BSD, Mac. Provavelmente, as portas do Windows também estão por aí.

    
por 04.08.2018 / 15:28