Czasami źle rozumiem składnię polecenia:
# mysql -d test
mysql: unknown option '-d'
# echo $?
2
Próbuję ponownie i mam rację:
# mysql --database test
Welcome to the MySQL monitor.
mysql >
...
Jak zapobiec pierwszej komendzie z kodem błędu innym niż 0, aby przejść do historii?
bash
command-history
Adam Matan
źródło
źródło
Jedynym sposobem mogę myśleć to zrobić byłoby użyć
history -d
w$PROMPT_COMMAND
. Problem z tym lub innym podejściem polega na tym, że nie można stwierdzić, czy polecenie zakończyło się błędem, czy zakończyło się pomyślnie z niezerowym kodem wyjścia.źródło
Dobrze jest mieć ostatni niepoprawny komentarz, aby go poprawić, ale wkrótce potem staje się potencjalnie mylącym śmieciem.
Moje podejście jest dwuetapowe: przechowuj polecenia, które się nie powiedzie, i usuwaj je później.
Przechowuj polecenia, które nie działają, gdy:
trap command signals
wykonuje się,command
gdy jeden z nichsignals
jest „podniesiony”.$(command)
, wykonujecommand
i przechwytuje dane wyjściowe.Gdy polecenie nie powiedzie się, ten fragment kodu przechwytuje w historii numer ostatniego polecenia zapisanego w historii i zapisuje go w zmiennej do przyszłego usunięcia.
Prosty, ale działa niepoprawnie z
HISTCONTROL
iHISTIGNORE
- gdy polecenie nie jest zapisane w historii z powodu jednej ze zmiennych, numer historii ostatniego polecenia zapisanego w historii jest numerem poprzedniego polecenia; więc jeśli nieprawidłowe polecenie nie zostanie zapisane w historii, poprzednie polecenie zostanie usunięte.Nieco bardziej skomplikowana wersja, która w tym przypadku działa poprawnie:
Usuń przechowywane polecenia później:
Wyjaśnienie:
Wychodząc z Bash, dla każdego unikalnego numeru historii usuń odpowiedni wpis historii,
a następnie usuń zaznaczenie,
FAILED_COMMANDS
aby nie usuwać poleceń, które odziedziczyły numery historii z już usuniętych poleceń.Jeśli masz pewność, że
FAILED_COMMANDS
będą wolne od duplikatów, możesz po prostu iterować(np. Pisać
for i in $FAILED_COMMANDS
). Jeśli jednak można oczekiwać, że nie mogą być sortowane od największego do najmniejszego (w tym przypadku to zawsze jest), wymienićuniq
zsort -rnu
.Numery historii
FAILED_COMMANDS
muszą być unikalne i posortowane od największych do najmniejszych, ponieważ po usunięciu wpisu numery kolejnych poleceń są przesuwane - tzn. kiedy wydajeszhistory -d 2
, 3. wpis staje się 2., 4. staje się 3. itd.Z tego powodu podczas korzystania z tego kodu nie można ręcznie wywoływać,
history -d <n>
gdzie
n
jest mniejszy lub równy największemu przechowywanemu numerowiFAILED_COMMANDS
i oczekiwać, że kod będzie działał poprawnie.
Prawdopodobnie dobrym pomysłem jest zaczepienie
exit_handler
sięEXIT
, ale możesz też zadzwonić w dowolnym momencie wcześniej.źródło