Mirror Bash history

2

Eu ensino em várias ferramentas CLI como git, docker etc. Eu quero ter dois terminais bash: um para executar comandos e obter saída, e um que sempre reflete apenas o que o histórico de comandos me daria.

É possível espelhar comandos em tempo real no bash assim?

Exemplo:

T1: pwd

T1: / home / me

T1: ls

T1: Downloads de área de trabalho de documentos

T2:

pwd
ls
    
por Sofus Albertsen 24.08.2016 / 13:41

3 respostas

2

Então, vamos dividir o problema em duas partes:

Primeiro, você precisa ter certeza de que o histórico do bash está sendo atualizado imediatamente. Toda vez que você digitar qualquer entrada e teclar enter, o comando deve ser escrito em .bash_history .

Isso pode ser feito adicionando algo como seguir no seu .bashrc :

PROMPT_COMMAND='history -a; history -c; history -r'

Em segundo lugar, você quer ler o arquivo .bash_history constantemente. Para isso você pode usar o comando tail no seu segundo terminal:

tail -f .bash_history

o parâmetro -f significa que a cauda mantém o arquivo aberto e imprime novas linhas à medida que elas são gravadas.

    
por 24.08.2016 / 15:55
0

Se você precisa ter o comando antes ser executado, é bastante complicado usar uma armadilha DEBUG bash, mas veja esta resposta e a versão longa . Aqui está uma versão simples. Crie um arquivo, diga ~/traceme com o conteúdo:

#!/bin/bash
# run preexec on each cmd before execute it
# see https://superuser.com/a/175802/458747
preexec(){ 
    echo "$1" >>~/myhistory
}
preexec_invoke_exec(){
    [ -n "$COMP_LINE" ] && return  # do nothing if completing
    # don't cause a preexec for $PROMPT_COMMAND
    [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return 
    local this_command=$(HISTTIMEFORMAT= history 1 | 
                                         sed -e "s/^[ ]*[0-9]*[ ]*//");
    preexec "$this_command"
}
trap 'preexec_invoke_exec' DEBUG

e no seu terminal T1, source ~/traceme . Então, em T2, faça tail -f ~/myhistory . Todos os comandos que você digitar no T1 serão gravados no final do arquivo que está no final de T2, antes de ser executado.

    
por 24.08.2016 / 16:11
0

Não sei se esta é uma opção viável para você, como você perguntou sobre o bash. Mas o zsh grava o histórico diretamente em .zsh_history . Então você poderia ter um terminal tail -f .zsh_history . E use outro terminal zsh para os comandos reais.

Mas isso é se você estiver disposto a usar o zsh.

    
por 24.08.2016 / 23:37