Verlauf - Listet nur erfolgreich ausgeführte Befehle auf

10

Ich frage mich, ob es eine Möglichkeit gibt, den Befehl history zu verwenden, aber nur Befehle aufzulisten, die erfolgreich ausgeführt wurden. Gibt es auch eine Möglichkeit, Fehler aufzulisten?

Ich weiß, dass jeder Befehl den Exit-Status hat:

0- Erfolgreiche Ausführung des Befehls
1- Der Befehl schlägt aufgrund eines Fehlers während der Erweiterung oder Umleitung fehl. Der Beendigungsstatus ist größer als Null.
2- Falsche Befehlsverwendung
12- Befehl gefunden, aber nicht ausführbar
127- Befehl nicht gefunden

und kann überprüft werden, indem der Befehl mit echo $?
folgender Adresse ausgeführt wird : http://www.linuxnix.com/2011/03/find-exit-status-script-command-linux.html

Beispiel:

Nach dem Ausführen dieser 4 Befehle:

ls
help
lss
ls nonexistentfile

Ich habe versucht zu testen, um nur erfolgreiche Befehle zu drucken (Exit-Status 0), die nur 'ls' und 'help' sein sollten:

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

Dies gibt aus:

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

Das funktioniert etwas, aber es gibt zwei Probleme:

  1. Aus irgendeinem Grund werden grep -v 'bash'Zeilen, die 'bash' enthalten, nicht ausgeschlossen, aber wenn ich dies tue grep 'bash', werden nur die Zeilen mit 'bash' eingeschlossen. Ich bin mir nicht sicher, warum eine funktioniert und nicht die andere.
  2. Es trennt jede Zeile / jeden Befehl durch eine Zeichenfolge. Der letzte lsBefehl sollte sein
    ls nonexistentfile, aber er wird ausgeführt lsund nonexistentfileals separate Befehle.

Irgendeine Idee, was ich im Befehl anpassen soll oder wie ich das machen soll?

lkisac
quelle

Antworten:

4

Dies war ein Hack, den ich einmal für ein freigegebenes Konto verwendet habe, um zu verfolgen, wer was getan hat:

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

Es schreibt das, historybevor das PROMPTangezeigt wird: in der Tat nach jedem Befehl. Sie können dies ändern, um den Exit-Code im Verlauf zu speichern:

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

Dies würde Einträge in Ihrer Geschichte hinterlassen wie:

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

(Der letzte Eintrag wird nach dem historyBeenden des Befehls aktualisiert, sodass der Exit-Code in dieser Ausgabe nicht sichtbar ist.)

Dies hat den ärgerlichen Effekt, dass der Verlauf in Ihrer Eingabeaufforderung den Kommentar enthält:

$ # press up
$ history 2 #0

Der Kommentar wirkt sich normalerweise nicht auf die Ausführung oder Ausgabe aus, macht das Bearbeiten jedoch zu einem Problem.

Jetzt können Sie in grepIhrem Verlauf sehen, welche Codes erfolgreich beendet wurden:

history | grep '#0$'
# or grep '#[^0]*$' for unsuccessful commands.
muru
quelle
Ich habe es sowohl auf Mobaxterm als auch auf Putty versucht und ls #$CODE, ll #$CODEfür die Verlaufsausgabe bekommen. Ich bin mir nicht sicher , ob es für Sie arbeitet, aber ich musste sich ändern sed -i '\$s/\$/ \#\$CODE/' $HISTFILE'zu sed -i '\$s/\$/ \#$CODE/' $HISTFILE. Ich nahm das `` vor $ CODE
lkisac
@lkisac Seltsamerweise gab es #(kein Code) ohne die Flucht. Muss ein Zitatproblem sein.
Muru