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

просто добавить || true после команды, где вы хотите игнорировать ошибки.


более лаконично:

! 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