history - Lista apenas comandos executados com sucesso

9

Eu estou querendo saber se existe uma maneira de usar o comando history , mas listar apenas os comandos que foram executados com sucesso. Da mesma forma, haveria uma maneira de listar os que produziam erros?

Eu sei que cada comando tem um status de saída de:

0 - Execução bem-sucedida do comando
1 - O comando falha devido a um erro durante a expansão ou o redirecionamento, o status de saída é maior que zero.
2 - Uso incorreto do comando
12 - Comando encontrado mas não executável
127 - Comando não encontrado

e pode ser verificado a partir do comando com echo $? de: link

Exemplo:

Depois de executar esses 4 comandos:

ls
help
lss
ls nonexistentfile

Eu tentei testar para imprimir apenas comandos bem-sucedidos (status de saída 0), que deve ser apenas 'ls' e 'help':

for j in 'history | tail -5 | head -4 | cut -d ' ' -f5-'; do $j > cmd_out; if [[ 'echo $?' != 0 ]]; then :; else echo $j | grep -v 'bash'; fi; done; rm cmd_out

Esta saída:

ls
help
bash: lss: command not found
ls
bash: nonexistentfile.txt: command not found

Isso funciona um pouco, mas há dois problemas:

  1. Por alguma razão, grep -v 'bash' não está excluindo as linhas que contêm 'bash', mas se eu usar grep 'bash' , incluirá apenas as linhas com 'bash', não sei por que uma funciona e não a outra .
  2. Ele está separando cada linha / comando por string. O último comando ls deve ser ls nonexistentfile , mas está executando ls e nonexistentfile como comandos separados.

Alguma idéia sobre o que devo ajustar no comando, ou como fazer isso?

    
por lkisac 01.10.2014 / 20:10

1 resposta

3

Este foi um hack que usei uma vez em uma conta compartilhada para rastrear quem fez o quê:

PROMPT_COMMAND="history -a; sed -i '\$s/\$/ \#$NAME/' $HISTFILE; history -r; $PROMPT_COMMAND"

Grava o history antes da exibição do PROMPT : na verdade, após cada comando. Você poderia modificar isso para usar salvar o código de saída no histórico:

PROMPT_COMMAND="CODE=$?; history -a; sed -i '\$s/\$/ \#\$CODE/' $HISTFILE; history -r; $PROMPT_COMMAND"

Isso deixaria entradas no seu histórico como:

$ history 2
 1271  vim .bashrc #0
 1272  history 2

(A última entrada será atualizada, após o comando history sai, portanto o código de saída não é visível nesta saída.)

Isso tem o efeito irritante de que o histórico no seu prompt terá o comentário:

$ # press up
$ history 2 #0

O comentário não afeta a execução ou a saída normalmente, mas dificulta a edição.

Agora você pode grep do seu histórico para ver quais códigos saíram com sucesso:

history | grep '#0$'
# or grep '#[^0]*$' for unsuccessful commands.
    
por 01.10.2014 / 20:40