historique - Répertorie uniquement les commandes exécutées avec succès

10

Je me demande s'il y a un moyen d'utiliser la commande history mais seulement lister les commandes qui ont été exécutées avec succès. De même, y aurait-il un moyen de répertorier ceux qui ont généré des erreurs?

Je sais que chaque commande a un statut de sortie de:

0- Exécution réussie de la commande
1- La commande échoue en raison d'une erreur lors de l'expansion ou de la redirection, l'état de sortie est supérieur à zéro.
2- Utilisation incorrecte de la commande
12- Commande trouvée mais non exécutable
127- Commande non trouvée

et peut être vérifié en poursuivant la commande à echo $?
partir de: http://www.linuxnix.com/2011/03/find-exit-status-script-command-linux.html

Exemple:

Après avoir exécuté ces 4 commandes:

ls
help
lss
ls nonexistentfile

J'ai essayé de tester pour imprimer uniquement les commandes réussies (état de sortie de 0), qui ne devraient être que «ls» et «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

Cela produit:

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

Cela fonctionne quelque peu, mais il y a deux problèmes:

  1. Pour une raison quelconque, grep -v 'bash'n'exclut pas les lignes contenant 'bash', mais si je le fais grep 'bash', cela n'inclura que les lignes avec 'bash', je ne sais pas pourquoi l'une fonctionne et pas l'autre.
  2. C'est séparer chaque ligne / commande par chaîne. La dernière lscommande devrait être
    ls nonexistentfile, mais elle s'exécute lset nonexistentfilecomme des commandes distinctes.

Une idée sur ce que je devrais ajuster dans la commande, ou comment procéder?

lkisac
la source

Réponses:

4

C'était un hack que j'ai utilisé une fois sur un compte partagé pour suivre qui a fait quoi:

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

Il écrit l' historyavant avant l' PROMPTaffichage: en effet, après chaque commande. Vous pouvez modifier cela pour utiliser enregistrer le code de sortie dans l'historique:

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

Cela laisserait des entrées dans votre historique comme:

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

(La dernière entrée sera mise à jour après la historysortie de la commande, donc le code de sortie n'est pas visible dans cette sortie.)

Cela a pour effet ennuyeux que l'historique dans votre invite aura le commentaire:

$ # press up
$ history 2 #0

Le commentaire n'affecte généralement pas l'exécution ou la sortie, mais rend l'édition difficile.

Vous pouvez maintenant grepconsulter votre historique pour voir quels codes ont réussi à sortir:

history | grep '#0$'
# or grep '#[^0]*$' for unsuccessful commands.
muru
la source
Je l'ai essayé à la fois sur Mobaxterm et Putty, et j'ai obtenu ls #$CODE, ll #$CODEla sortie de l'historique. Je ne sais pas si cela fonctionne pour vous, mais j'ai dû changer sed -i '\$s/\$/ \#\$CODE/' $HISTFILE'pour sed -i '\$s/\$/ \#$CODE/' $HISTFILE. J'ai pris la sortie avant $ CODE
lkisac
@lkisac Curieusement pour moi, il a donné #(pas de code) sans l'évasion. Doit être un problème de citation.
muru