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 собирается независимо от того, выполнена команда или нет.