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:
- 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. - Oddziela każdą linię / polecenie ciągiem znaków. Ostatnie
ls
polecenie powinno być
ls nonexistentfile
, ale jest uruchomionels
inonexistentfile
jako osobne polecenie.
Masz pomysł, co powinienem dostosować w poleceniu lub jak to zrobić?
źródło
ls #$CODE, ll #$CODE
historyczne. Nie jestem pewien, czy to działa, ale musiałem się zmienićsed -i '\$s/\$/ \#\$CODE/' $HISTFILE'
nased -i '\$s/\$/ \#$CODE/' $HISTFILE
. Wziąłem `` out przed $ CODE#
(bez kodu) bez ucieczki. To musi być jakiś problem z cytowaniem.