Я использую следующие варианты
set -o pipefail
set -e
В скрипте bash остановить выполнение при ошибке. У меня ~ 100 строк выполнения скрипта, и я не хочу проверять код возврата каждой строки в скрипте.
Но для одной конкретной команды я хочу игнорировать ошибку. Как я могу это сделать?
-e
завершает работу », когда атрибут установлен, «если команда, которая не выполняется, является частью списка команд, следующего сразу за ключевым словомwhile
илиuntil
, частью теста вif
выражении, частью любой выполняемой команды в списке&&
или,||
за исключением команды, следующей за последней&&
или||
любой командой в конвейере, кроме последней, или если статус возврата команды инвертируется!
. "(ldd $2/bin/* || true) | grep "not found" | wc -l
скрипт завершается после этой строки, когда ldd возвращает ошибку(ldd $2/bin/* || true) | grep "not found" | wc -l || true
set -o pipefail
. когдаgrep
ничего не находит, он возвращает ненулевой код выхода, и для оболочки достаточно думать, что весь канал имеет ненулевой код выхода.Просто добавьте
|| true
после команды, где вы хотите игнорировать ошибку.источник
set -e
и пытается захватить сообщение об ошибке: напримерset -e; TEST=$(foo 2>&1 || true); echo $TEST
Не останавливайтесь и сохраняйте статус выхода
На всякий случай, если вы хотите, чтобы ваш скрипт не останавливался, если какая-то команда не выполнена, и вы также хотите сохранить код ошибки неудачной команды:
источник
command
было успешным, и нужно запускать то, что после||
. прочитайте это как: еслиcommand
потерпит неудачу, сделайтеEXIT_CODE=$?
. Вы, вероятно, могли бы просто сделатьcommand || echo "$?"
или использовать «trap» для более подробной отладки. Смотрите это -> stackoverflow.com/a/6110446/10737630Более кратко:
Из спецификации POSIX относительно
set -e
(выделено мое):источник
-e
.!
оболочка не сможет выйти, несмотря ни на что. Этот сценарий отображает сообщение,Still alive!
когда я его запускаю, указывая, что сценарий завершился. Вы видите другое поведение?if
предложении и решил проблему.Вместо «возврата true» вы также можете использовать утилиту «noop» или null (как указано в спецификации POSIX )
:
и просто «ничего не делать». Вы сохраните несколько писем. :)источник
Если вы хотите предотвратить сбой вашего скрипта и собрать код возврата:
returncode
собирается независимо от того, была ли команда успешной или неудачной.источник
Я использовал приведенный ниже фрагмент при работе с инструментами CLI и хочу знать, существует какой-то ресурс или нет, но меня не волнует вывод.
источник
if [ -r not_exist ]
Мне вроде как это решение:
Команда / скрипт между обратными галочками выполняется, и ее вывод подается на команду ":" (что эквивалентно "true")
редактировать: исправлена некрасивая опечатка
источник
хотя
|| true
предпочтительнее, но вы также можете сделатьисточник
Отсюда ни одно решение не сработало, поэтому я нашел другое:
Это полезно для CI & CD. Таким образом, сообщения об ошибках печатаются, но весь сценарий продолжает выполняться.
источник
Пример использования этого для создания файла журнала
источник
Спасибо за простое решение здесь сверху:
Следующая конструкция может использоваться для дополнительных действий / устранения неполадок шагов сценария и дополнительных параметров управления потоком:
Мы можем затормозить дальнейшие действия и
exit 1
при необходимости.источник