Bash игнорирует ошибку для конкретной команды
Я использую следующие варианты
set -o pipefail
set -e
в сценарии bash, чтобы остановить выполнение при ошибке. У меня есть 100 выполнения скрипта, и я не хочу проверять код возврата скрипта. Но для конкретного скрипта я хочу игнорировать ошибку. Как я могу это сделать ?
6 ответов
решение:
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
off он должен последний).
$ set -o pipefail
$ false | true ; echo $?
1
$ set +o pipefail
$ false | true ; echo $?
0
более лаконично:
! particular_script
С спецификация POSIX о set -e
(выделено мной):
Если эта опция включена, если простая команда терпит неудачу по любой из причин, перечисленных в Последствия Shell ошибки или возвращает статус выхода значение >0, и не является частью составного списка ниже, пока, или если сайта, а не частью и или или список, и это не газопровод предшествовало ! зарезервированный слово, после этого раковина немедленно выйдет.
на всякий случай, если вы хотите, чтобы ваш скрипт не останавливался, если определенная команда терпит неудачу, и вы также хотите сохранить код ошибки неудачной команды:
код
set -e;
command || EXIT_CODE=$? && true ;
echo $EXIT_CODE
вместо " returning true "вы также можете использовать утилиту" noop " или null (как указано в спецификации POSIX) :
и просто "ничего не делать". Вы сохраните несколько писем. :)
#!/usr/bin/env bash
set -e
man nonexistentghing || :
echo "It's ok.."
я использовал фрагмент ниже при работе с инструментами CLI, и я хочу знать, существует ли какой-то ресурс или нет, но меня не волнует результат.
if [ -z "$(cat no_exist 2>&1 >/dev/null)" ]; then
echo "none exist actually exist!"
fi