Eu uso um alias simples para ativar o "rastreamento" de comandos em uma ou mais janelas do terminal:
alias trackmi='export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"'
Então, bastai otail -f
meu arquivo .bash_history em outro terminal da área de trabalho para obter feedback imediato. Acabei de ativar o histórico ilimitado e atualizei o formato do meu histórico ( export HISTTIMEFORMAT="[%F %T] "
) em .bashrc . Obviamente, o history
comando exibe os carimbos de data e hora. Mas o formato do arquivo de histórico em si é:
#1401234303
alias
#1401234486
cat ../.bashrc
Como posso converter o horário do Unix e o comando inteiro exibido em uma única linha, como no history
comando, incluindo numeração:
578 [2014-05-27 19:45:03] alias
579 [2014-05-27 19:48:06] cat ../.bashrc
... e siga isso. Ou encontrar uma maneira de produzir continuamente a saída do history
comando para o terminal?
bash
text-processing
command-history
date
Comunidade
fonte
fonte
fn+1
para comparar! Obrigado!Aqui está o produto final em ação em um xterm de tela dividida, dos padrões basicamente do shell ao trabalho em apenas alguns comandos:
Uma maneira mais difícil de fazer isso do que é demonstrado na captura de tela pode ser assim:
Onde
${TGT_PTY}
estaria o que você obtém dotty
comando ao executar um shell interativo na tela em que deseja sua saída. Ou, realmente, você pode usar qualquer arquivo gravável, pois é essencialmente apenas um alvo para o redirecionamento de arquivos.Eu uso a sintaxe pty para pseudo-terminal, porque estou assumindo que é um xterm de algum tipo, mas você pode dedicar um vt com a mesma facilidade - e seu histórico transmitido é sempre apenas uma
CTRL-ALT-Fn
combinação de teclas. Se fosse comigo eu poderia combinar as duas noções e torná-lo umscreen
outmux
sessão em um vt dedicado ... Mas eu discordo.Em uma máquina recém-inicializada, sou recebido com o
/bin/login
prompt típico em umgetty
console Linux típico . PressionoCTRL-ALT-F2
para acessar umkmscon
console menos típico que se comporta muito mais como umxterm
que com umtty
. Entro no comandotty
e recebo em resposta/dev/pts/0
.Geralmente, os xterms multiplexam um único dispositivo de terminal em vários usando pseudo-terminais - portanto, se você fizesse algo semelhante no X11 alternando entre as guias ou janelas do terminal, provavelmente também receberia saída
/dev/pts/[0-9]*
. Mas os consoles de terminais virtuais acessados comCTRL-ALT-Fn
combinações de teclas são verdadeiros dispositivos de terminal e, portanto, recebem sua própria/dev/tty[0-9]*
designação.É por isso que, depois de entrar no console 2, quando digito
tty
no prompt, a resposta é,/dev/pts/0
mas quando faço o mesmo no console 1, a saída é/dev/tty1
. De qualquer forma, de volta ao console 2, faço:Não há efeito discernível. Continuo digitando mais alguns comandos e depois mudo para o console 1 pressionando
CTRL-ALT-F1
novamente. E lá encontro entradas repetidas que se parecem com<date_time>\n<hist#>\t<hist_cmd_string>
todos os comandos que digitei no console 2.Com exceção da gravação direta em um dispositivo terminal, outra opção poderia ser algo como:
E então talvez ...
O comando rough prompt não atende às suas especificações - nenhuma string de
date
formatação para e nenhuma opção de formatação parafc
elas - mas seu mecanismo não exige muito: toda vez que seu prompt renderiza o último comando do histórico e a data e hora atuais são gravadas em o${TGT_PTY}
arquivo que você especificar. É simples assim.Observar e imprimir o histórico do shell é
fc
o objetivo principal do. É um shell embutido, mesmo quedate
não seja. O Inzsh
fc
pode fornecer todos os tipos de opções de formatação sofisticadas, várias das quais se aplicam a carimbos de data e hora. E é claro, como você notou acima,bash
ohistory
pode fazer o mesmo.No interesse de uma saída mais limpa, você pode usar uma técnica que expliquei melhor aqui para definir uma variável de rastreamento persistente no shell atual, apesar de ter que rastreá-lo e processá-lo em subshells na sequência de prompt.
Aqui está um meio portátil de formatar com suas especificações:
Eu implemento o contador last_history
$_LH
que apenas rastreia as atualizações mais recentes para que você não escreva o mesmo comando de histórico duas vezes - por exemplo, apenas pressionando enter. Há um pouco de disputa necessária para incrementar a variável no shell atual, para que ela retenha seu valor mesmo que a função seja chamada em um subshell - o que é novamente explicado melhor no link .Sua saída parece
<hist#>\t[%F %T]\t<hist_cmd>\n
Mas essa é apenas a versão totalmente portátil. Com
bash
isso, pode ser feito com menos e implementando apenas os recursos internos do shell - o que provavelmente é desejável quando você considera que este é um comando que será executado toda vez que você pressionar[ENTER]
. Aqui estão duas maneiras:Como alternativa, usando
bash
ohistory
comando 's , você pode definir a_HIST
função desta maneira:A saída para qualquer método também se parece com:
<hist#>\t[%F %T]\t<hist_cmd>\n
embora ohistory
método inclua alguns espaços em branco à esquerda. Ainda assim, acredito que oshistory
carimbos de data e hora do método serão mais precisos, pois não acho que precisariam esperar o comando referenciado ser concluído antes de adquirir o carimbo.É possível evitar o rastreamento de qualquer estado nos dois casos, se você filtrar o fluxo de alguma forma
uniq
- como você pode fazermkfifo
como mencionei antes.Mas fazê-lo no prompt como este significa que ele sempre é atualizado apenas assim que necessário, apenas pela simples ação de atualizar o prompt. É simples.
Você também pode fazer algo semelhante ao que está fazendo,
tail
mas definirfonte
${TGT_PTY}
e tudo mais? Nesse caso, explicaria o 'redirecionamento ambíguo' porque essa seria uma variável vazia. Você precisa de um arquivo./dev/pts/[num]
com toda a probabilidade - #cat
eu era paranóico. Funciona bem - até 12 horas depois.Sinta-se livre para jogar com a formatação, mas isso (acredito) faz o que você está pedindo ... salve em algum lugar do seu PATH, torne o executável e aproveite:
Tenho certeza de que pode ser otimizado, mas você entendeu.
Breve explicação: como o ~ / .bash_history não acompanha a contagem, primeiro determinamos o número de entradas. Em seguida, um pouco de magia awk para obter a formatação correta e acompanhar o número de entradas.
fonte
tail -f
lerá 10 linhas inicialmente que já foram incluídas no seucount
. Ele assume a data GNU em um ambiente não POSIX (POSIXLY_CORRECT não configurado). Ele executa um shell e um comando de data por carimbo de data / hora.count
conta metade da linha.bash_history
e, em seguida, é incrementado para cada linha que não inicia#
, portanto a contagem do histórico relatado provavelmente está incorreta. O usocount=$(grep -c '^#' ...)
provavelmente seria melhor, mas, em qualquer caso, é provável que esses números do histórico acabem fora de sincronia, especialmente se você tiver mais de 2 bash em execução ao mesmo tempo.history
comando utiliza.