Bash игнорирование ошибки для конкретной команды
Я использую следующие варианты
set -o pipefail
set -e
В скрипте bash остановить выполнение при ошибке. У меня ~ 100 строк выполнения скрипта, и я не хочу проверять код возврата каждой строки в скрипте.
Но для одной конкретной команды я хочу игнорировать ошибку. Как я могу это сделать?
Ответы
Ответ 1
Решение:
particular_script || true
Пример:
$ cat /tmp/1.sh
particular_script()
{
false
}
set -e
echo ein
particular_script || true
echo zwei
particular_script
echo drei
$ bash /tmp/1.sh
ein
zwei
drei
никогда не будет напечатан.
Кроме того, я хочу добавить, что, когда pipefail
включен,
достаточно, чтобы оболочка подумала, что весь канал имеет ненулевой код выхода
когда одна из команд в трубе имеет ненулевой код выхода (при этом pipefail
он должен быть последним).
$ set -o pipefail
$ false | true ; echo $?
1
$ set +o pipefail
$ false | true ; echo $?
0
Ответ 2
Просто добавьте || true
после команды, в которой вы хотите проигнорировать ошибку.
Ответ 3
Более кратко:
! particular_script
Из спецификации POSIX относительно set -e
(выделено мной):
Если этот параметр включен, если простая команда не выполняется по любой из причин, перечисленных в Последствиях ошибок оболочки, или возвращает значение состояния выходa > 0 и не является частью составного списка через некоторое время, пока, или если ключевое слово и не является частью списка AND или OR и не является конвейером , которому предшествует! зарезервированное слово, то оболочка должна немедленно выйти.
Ответ 4
Не останавливайтесь и сохраняйте статус выхода
На всякий случай, если вы хотите, чтобы ваш сценарий не останавливался, если какая-то команда не выполнена, и вы также хотите сохранить код ошибки неудачной команды:
set -e
EXIT_CODE=0
command || EXIT_CODE=$?
echo $EXIT_CODE
Ответ 5
Вместо "возврата true" вы также можете использовать утилиту "noop" или null (как указано в спецификации POSIX) :
и просто "ничего не делать". Вы сохраните несколько писем. :)
#!/usr/bin/env bash
set -e
man nonexistentghing || :
echo "It ok.."
Ответ 6
Я использовал приведенный ниже фрагмент при работе с инструментами CLI и хочу знать, существует какой-то ресурс или нет, но меня не волнует вывод.
if [ -z "$(cat no_exist 2>&1 >/dev/null)" ]; then
echo "none exist actually exist!"
fi
Ответ 7
в то время как || true
|| true
является предпочтительным, но вы также можете сделать
var=$(echo $(exit 1)) # it shouldn't fail
Ответ 8
Мне нравится это решение:
: 'particular_script'
Команда/скрипт между обратными галочками выполняется, и ее вывод подается на команду ":" (что эквивалентно "true")
$ false
$ echo $?
1
$ : 'false'
$ echo $?
0
редактировать: исправлена некрасивая опечатка
Ответ 9
Если вы хотите предотвратить сбой сценария и собрать код возврата:
command () {
return 1 # or 0 for success
}
set -e
command && returncode=$? || returncode=$?
echo $returncode
returncode
собирается независимо от того, выполнена команда или нет.