Я использую следующие параметры
set -o pipefail
set -e
В bash script, чтобы остановить выполнение при ошибке. У меня есть 100 из script, и я не хочу проверять код возврата script. Но для конкретного script я хочу проигнорировать ошибку. Как я могу это сделать?
Решение:
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
Просто добавьте || true
после команды, в которой вы хотите проигнорировать ошибку.
set -e
и попытке перехватить сообщение об ошибке: например, set -e; TEST=$(foo 2>&1 || true); echo $TEST
Более кратко:
! particular_script
Из спецификации POSIX относительно set -e
(выделено мной):
Если этот параметр включен, если простая команда не выполняется по любой из причин, перечисленных в Последствиях ошибок оболочки, или возвращает значение состояния выходa > 0 и не является частью составного списка через некоторое время, пока, или если ключевое слово и не является частью списка AND или OR и не является конвейером , которому предшествует! зарезервированное слово, то оболочка должна немедленно выйти.
-e
.
!
будет препятствовать выходу оболочки несмотря ни на что. Этот скрипт отображает сообщение Still alive!
когда я запускаю его, указывая, что сценарий завершился. Вы видите другое поведение?
Вместо "return true" вы также можете использовать noop :
и просто "ничего не делать". Вы сохраните несколько писем.:)
#!/usr/bin/env bash
set -e
man nonexistentghing || :
echo "It ok.."
На всякий случай, если вы хотите, чтобы ваш script не останавливался, если какая-то конкретная команда терпит неудачу, и вы также хотите сохранить код ошибки неудавшейся команды:
код
set -e;
command || EXIT_CODE=$? && true ;
echo $EXIT_CODE
-e
установлен атрибут « , если команда , которая не является частью списка команд сразу же послеwhile
илиuntil
ключевого слова, часть теста вif
заявлении, часть любой команды, выполняемой в списке&&
или||
за исключением команды, следующей за последним&&
или||
, любой команды в конвейере, кроме последней, или если статус возврата команды инвертируется с!
"