Ошибка игнорирования Bash для конкретной команды

231

Я использую следующие параметры

set -o pipefail
set -e

В bash script, чтобы остановить выполнение при ошибке. У меня есть 100 из script, и я не хочу проверять код возврата script. Но для конкретного script я хочу проигнорировать ошибку. Как я могу это сделать?

Теги:

5 ответов

370
Лучший ответ

Решение:

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
  • 12
    +1. Как Bash Reference Manual объясняет , «Оболочка не выходит» , когда -e установлен атрибут « , если команда , которая не является частью списка команд сразу же после while или until ключевого слова, часть теста в if заявлении, часть любой команды, выполняемой в списке && или || за исключением команды, следующей за последним && или || , любой команды в конвейере, кроме последней, или если статус возврата команды инвертируется с ! "
  • 1
    @ruakh: Это верно
Показать ещё 6 комментариев
98

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

  • 8
    Я думаю, что важно добавить это: этот метод позволит сохранить код ответа и сообщение об ошибке, тогда как "!" Метод, описанный ниже, изменит код ответа и, следовательно, не выдаст ошибку. Это важно при использовании set -e и попытке перехватить сообщение об ошибке: например, set -e; TEST=$(foo 2>&1 || true); echo $TEST
31

Более кратко:

! particular_script

Из спецификации POSIX относительно set -e (выделено мной):

Если этот параметр включен, если простая команда не выполняется по любой из причин, перечисленных в Последствиях ошибок оболочки, или возвращает значение состояния выходa > 0 и не является частью составного списка через некоторое время, пока, или если ключевое слово и не является частью списка AND или OR и не является конвейером , которому предшествует! зарезервированное слово, то оболочка должна немедленно выйти.

  • 9
    Это просто инвертирует код завершения команды, поэтому успешно завершенная команда вернет 1 вместо 0 и завершит работу сценария с -e .
  • 8
    Я понимаю, что ! будет препятствовать выходу оболочки несмотря ни на что. Этот скрипт отображает сообщение Still alive! когда я запускаю его, указывая, что сценарий завершился. Вы видите другое поведение?
Показать ещё 1 комментарий
15

Вместо "return true" вы также можете использовать noop : и просто "ничего не делать". Вы сохраните несколько писем.:)

#!/usr/bin/env bash
set -e
man nonexistentghing || :
echo "It ok.."
  • 2
    хотя ||: не так ясно, как || правда (что может сбить с толку неопытных пользователей), мне нравится лаконичность
7

На всякий случай, если вы хотите, чтобы ваш script не останавливался, если какая-то конкретная команда терпит неудачу, и вы также хотите сохранить код ошибки неудавшейся команды:

код

set -e;
command || EXIT_CODE=$? && true ; 
echo $EXIT_CODE

Ещё вопросы

Сообщество Overcoder
Наверх
Меню