Иногда я неправильно понимаю синтаксис команды:
# mysql -d test
mysql: unknown option '-d'
# echo $?
2
Я пытаюсь снова и понимаю это правильно:
# mysql --database test
Welcome to the MySQL monitor.
mysql >
...
Как запретить первой команде с кодом ошибки, отличным от 0, войти в историю?
bash
command-history
Адам Матан
источник
источник
Единственный способ , которым я могу думать , чтобы сделать это было бы использовать
history -d
в$PROMPT_COMMAND
. Проблема этого или любого другого подхода заключается в том, что невозможно определить, была ли команда завершена с ошибкой или успешно завершена с ненулевым кодом завершения.источник
Хорошо иметь последний неправильный комментарий, чтобы исправить его, но вскоре после этого он становится потенциально запутанным мусором.
Мой подход состоит из двух этапов: хранить команды, которые терпят неудачу, когда они делают, и удалять их через некоторое время.
Сохраните команды, которые терпят неудачу, когда они делают:
trap command signals
выполняется,command
когда один изsignals
"поднят".$(command)
, выполняетcommand
и захватывает его вывод.При сбое команды этот фрагмент кода фиксирует номер истории последней команды, сохраненной в истории , и сохраняет ее в переменной для последующего удаления.
Простой, но работает неправильно с
HISTCONTROL
иHISTIGNORE
- когда команда не сохраняется в истории из-за одной из переменных, номер истории последней команды, сохраненной в истории, равен номеру предыдущей команды; поэтому, если неправильная команда не сохранена в истории, предыдущая команда будет удалена.Чуть более сложная версия, которая корректно работает в таком случае:
Удалить сохраненные команды через некоторое время:
Объяснение:
При выходе из Bash для каждого уникального номера истории удаляйте соответствующую запись истории,
затем снимите флажок,
FAILED_COMMANDS
чтобы не удалять команды, унаследовавшие номера истории от уже удаленных команд.Если вы уверены, что в нем
FAILED_COMMANDS
не будет дубликатов, вы можете просто перебрать его(т.е. записать
for i in $FAILED_COMMANDS
). Однако, если вы ожидаете, что он не будет отсортирован от наибольшего к наименьшему (в данном случае это всегда так), замените егоuniq
наsort -rnu
.Номера истории в
FAILED_COMMANDS
должны быть уникальными и сортироваться от наибольшего к наименьшему, потому что при удалении записи номера следующих команд смещаются, т.е. при выдачеhistory -d 2
третья запись становится второй, четвертая становится третьей и т. д.Из-за этого при использовании этого кода вы не можете вручную вызвать,
history -d <n>
где
n
меньше или равно наибольшему числу, хранящемуся в,FAILED_COMMANDS
и ожидать, что код будет работать должным образом.
Это, вероятно , хорошая идея , чтобы зацепить
exit_handler
наEXIT
, но вы также можете позвонить в любое время его раньше.источник