cronologia: elenca solo i comandi eseguiti correttamente


10

Mi chiedo se esiste un modo per utilizzare il comando history ma elencare solo i comandi eseguiti correttamente. Allo stesso modo, ci sarebbe un modo per elencare quelli che hanno prodotto errori?

So che ogni comando ha uno stato di uscita di:

0- Esecuzione
1corretta del comando - Il comando ha esito negativo a causa di un errore durante l'espansione o il reindirizzamento, lo stato di uscita è maggiore di zero.
2- Utilizzo errato del comando
12- Comando trovato ma non eseguibile
127- Comando non trovato

e può essere verificato procedendo con il comando echo $?
da: http://www.linuxnix.com/2011/03/find-exit-status-script-command-linux.html

Esempio:

Dopo aver eseguito questi 4 comandi:

ls
help
lss
ls nonexistentfile

Ho provato a stampare solo i comandi riusciti (stato di uscita 0), che dovrebbe essere solo '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

Questo produce:

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

Questo in qualche modo funziona, ma ci sono due problemi:

  1. Per qualche motivo, grep -v 'bash'non esclude le righe contenenti 'bash', ma se lo faccio grep 'bash', includerà solo le righe con 'bash', non sono sicuro del motivo per cui uno funziona e non l'altro.
  2. Sta separando ogni riga / comando per stringa. L'ultimo lscomando dovrebbe essere
    ls nonexistentfile, ma è in esecuzione lse nonexistentfilecome comandi separati.

Qualche idea su cosa dovrei regolare nel comando o su come procedere?

Risposte:


4

Questo è stato un trucco che ho usato una volta su un account condiviso per tenere traccia di chi ha fatto cosa:

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

Scrive historyprima che PROMPTvenga visualizzato: in effetti, dopo ogni comando. È possibile modificarlo per utilizzare Salva il codice di uscita nella cronologia:

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

Ciò lascerebbe voci nella tua cronologia come:

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

(L'ultima voce verrà aggiornata dopo l' historyuscita del comando, quindi il codice di uscita non è visibile in questo output.)

Questo ha l'effetto fastidioso che la cronologia nel tuo prompt avrà il commento:

$ # press up
$ history 2 #0

Il commento non influisce in genere sull'esecuzione o sull'output, ma rende la modifica un problema.

Ora puoi la greptua cronologia per vedere quali codici sono usciti correttamente:

history | grep '#0$'
# or grep '#[^0]*$' for unsuccessful commands.

L'ho provato sia su Mobaxterm che su Putty e ho ottenuto ls #$CODE, ll #$CODEl'output della cronologia. Io non sono sicuro se funziona per voi, ma ho dovuto cambiare sed -i '\$s/\$/ \#\$CODE/' $HISTFILE'a sed -i '\$s/\$/ \#$CODE/' $HISTFILE. Ho preso il `` out before $ CODE
lkisac,

@lkisac Stranamente per me, ha dato #(senza codice) senza la fuga. Deve essere un problema di quotazione.
muru,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.