Используя Set -e, как сделать исключение для одной команды - PullRequest
0 голосов
/ 20 декабря 2018

Использование set -e в сценарии оболочки может позволить процессу завершиться немедленно, если одна из команд завершается с ненулевым статусом

Однако, если я хочу исключить одну команду, так что если этот конкретныйкоманда завершается с ненулевым значением, процесс продолжается.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Я обычно делаю

command ||:

Статус возврата : равен нулю.Если command возвращает ненулевой статус, то выполняется :, который возвращает нулевой статус.Если command возвращает нулевой статус, то : не выполняется.В обоих случаях - статус возврата равен нулю, т.е.успех.

Я видел:

command |:

Ну ... это на один символ короче, но привязка stdout к процессу : кажется для меня пустой тратой времени процессора.Статус возврата канала - это статус возврата последней выполненной команды, и это :.Но это может произойти сбой, когда set -o pipefail, поэтому я бы не рекомендовал его.

Вы можете запустить команду в подоболочке:

( set +e; command; )

это обеспечивает большую гибкость, но вам нужнодобавить ( перед командой и гораздо больше печатать.

0 голосов
/ 20 декабря 2018

Первое правило, не используйте set -e.Второе правило, см. Правило 1. Реализация set -e имеет странное поведение в крайних случаях и изменилась в различных версиях оболочек.Лучше всего не использовать его.Однако вы можете подавить это, просто сделав свою команду составной командой.Таким образом, вместо

cmd_which_may_fail

вы можете просто сделать:

cmd_which_may_fail || true

Теперь, если cmd_which_may_fail не сработает,скрипт не завершится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...