history - Listar apenas comandos executados com sucesso

10

Gostaria de saber se existe uma maneira de usar o comando history, mas apenas listar comandos que foram executados com sucesso. Da mesma forma, haveria uma maneira de listar aqueles que produziram 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 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 seguindo o comando echo $?
em: http://www.linuxnix.com/2011/03/find-exit-status-script-command-linux.html

Exemplo:

Depois de executar estes 4 comandos:

ls
help
lss
ls nonexistentfile

Tentei testar para imprimir apenas comandos bem-sucedidos (status de saída 0), que devem 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

Isso gera:

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 linhas que contêm 'bash', mas, se o fizer grep 'bash', incluirá apenas as linhas com 'bash', não sei por que um funciona e não o outro.
  2. Está separando cada linha / comando por string. O último lscomando deve ser
    ls nonexistentfile, mas está sendo executado lse nonexistentfilecomo comandos separados.

Alguma idéia do que devo ajustar no comando, ou como proceder para fazer isso?

lkisac
fonte

Respostas:

4

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

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

Ele grava o historyantes de PROMPTser exibido: com efeito, após cada comando. Você pode modificar isso para 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 a historysaída do comando, para que o código de saída não fique visível nessa saída.)

Isso tem o efeito irritante de que o histórico em 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 torna a edição um problema.

Agora você pode grepver seu histórico para ver quais códigos foram encerrados com êxito:

history | grep '#0$'
# or grep '#[^0]*$' for unsuccessful commands.
muru
fonte
Eu tentei tanto no Mobaxterm quanto no Putty e obtive ls #$CODE, ll #$CODEa saída do histórico. Não tenho certeza se funciona para você, mas tive que mudar sed -i '\$s/\$/ \#\$CODE/' $HISTFILE'para sed -i '\$s/\$/ \#$CODE/' $HISTFILE. Eu levei o `` fora antes de $ CODE
lkisac
@lkisac Estranhamente para mim, deu #(sem código) sem a fuga. Deve haver algum problema de citação.
Muru