historia - wyświetla listę tylko pomyślnie uruchamianych poleceń

10

Zastanawiam się, czy istnieje sposób użycia polecenia historii, ale tylko listy poleceń, które zostały pomyślnie uruchomione. Czy istnieje sposób na wylistowanie tych, które spowodowały błędy?

Wiem, że każde polecenie ma status wyjścia:

0- Pomyślne wykonanie polecenia
1- Polecenie kończy się niepowodzeniem z powodu błędu podczas rozwijania lub przekierowywania, status wyjścia jest większy od zera.
2- Niepoprawne użycie polecenia
12- Komenda znaleziona, ale nie wykonywalna
127- Komenda nie znaleziona

i można to sprawdzić, wykonując polecenie z echo $?
: http://www.linuxnix.com/2011/03/find-exit-status-script-command-linux.html

Przykład:

Po uruchomieniu tych 4 poleceń:

ls
help
lss
ls nonexistentfile

Próbowałem przetestować, aby wydrukować tylko udane polecenia (kod wyjścia 0), które powinny być tylko „ls” i „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

To daje:

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

To trochę działa, ale są dwa problemy:

  1. Z jakiegoś powodu grep -v 'bash'nie wyklucza wierszy zawierających „bash”, ale jeśli to zrobię grep 'bash', będą zawierać tylko wiersze z „bash”, nie jestem pewien, dlaczego jedno działa, a nie drugie.
  2. Oddziela każdą linię / polecenie ciągiem znaków. Ostatnie lspolecenie powinno być
    ls nonexistentfile, ale jest uruchomione lsi nonexistentfilejako osobne polecenie.

Masz pomysł, co powinienem dostosować w poleceniu lub jak to zrobić?

lkisac
źródło

Odpowiedzi:

4

To był hack, którego użyłem kiedyś na wspólnym koncie, aby śledzić, kto zrobił:

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

Zapisuje historyprzed PROMPTwyświetleniem: w efekcie po każdym poleceniu. Możesz to zmienić, aby zapisać kod wyjścia w historii:

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

Spowodowałoby to pozostawienie wpisów w Twojej historii, takich jak:

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

(Ostatni wpis zostanie zaktualizowany, gdy na historywyjściach sterujących, więc kod wyjścia nie jest widoczny w tym wyjściu).

Ma to irytujący efekt, że historia w twoim pytaniu będzie miała komentarz:

$ # press up
$ history 2 #0

Komentarz zwykle nie wpływa na wykonanie ani wyjście, ale sprawia kłopot edycji.

Teraz możesz zobaczyć grepswoją historię, aby zobaczyć, które kody zostały pomyślnie zakończone:

history | grep '#0$'
# or grep '#[^0]*$' for unsuccessful commands.
muru
źródło
Wypróbowałem to zarówno na Mobaxterm, jak i Putty, i uzyskałem wyniki ls #$CODE, ll #$CODEhistoryczne. Nie jestem pewien, czy to działa, ale musiałem się zmienić sed -i '\$s/\$/ \#\$CODE/' $HISTFILE'na sed -i '\$s/\$/ \#$CODE/' $HISTFILE. Wziąłem `` out przed $ CODE
lkisac
@ lkisac Dziwnie jak dla mnie, dał #(bez kodu) bez ucieczki. To musi być jakiś problem z cytowaniem.
muru