Игнорируя конкретные ошибки в shell-скрипт
У меня есть небольшой фрагмент сценария оболочки, который может вызвать много ошибок. У меня есть сценарий, установленный для глобальной остановки всех ошибок. Однако я хотел бы, чтобы этот небольшой подраздел немного отличался.
вот этот фрагмент:
recover database using backup controlfile until cancel || true;
auto
Я ожидаю, что это в конечном итоге приведет к ошибке "файл не найден". Однако я хотел бы продолжить выполнение этой ошибки. Для любой другой ошибки я хотел бы, чтобы скрипт остановился.
что будет лучший способ достичь этого?
Bash Версия 3.00.16
2 ответов
чтобы предотвратить bash игнорировать ошибку для определенных команд, вы можете сказать:
some-arbitrary-command || true
это заставит сценарий продолжаться. Например, если у вас есть следующий скрипт:
$ cat foo
set -e
echo 1
some-arbitrary-command || true
echo 2
выполнение его вернет:
$ bash foo
1
z: line 3: some-arbitrary-command: command not found
2
в отсутствие || true
в командной строке, он бы произвел:
$ bash foo
1
z: line 3: some-arbitrary-command: command not found
цитата руководство:
оболочка не выходит, если команда, которая не является частью список команд сразу после
while
илиuntil
ключевое слово, часть тест вif
оператор, часть любой команды, выполняемой в&&
или||
список, кроме команды, следующей за final&&
или||
любая команда в конвейере, но последний, или если состояние возврата команды перевернутый с!
. Ловушка наERR
, если установлено, выполняется перед оболочкой выходы.
EDIT: для того, чтобы изменить поведение такое, что в исполнении должно продолжаться только если выполнения some-arbitrary-command
вернулся file not found
в рамках ошибки, вы можете сказать:
[[ $(some-arbitrary-command 2>&1) =~ "file not found" ]]
в качестве примера выполните следующее (Без файла с именем MissingFile.txt
существует):
$ cat foo
#!/bin/bash
set -u
set -e
foo() {
rm MissingFile.txt
}
echo 1
[[ $(foo 2>&1) =~ "No such file" ]]
echo 2
$(foo)
echo 3
это производит следующий вывод:
$ bash foo
1
2
rm: cannot remove `MissingFile.txt': No such file or directory
отметим, что echo 2
была выполнена, но echo 3
не было.
использование:
command || :
: это встроенный bash, который всегда возвращает успех. И, как обсуждалось выше | / / короткие замыкания, поэтому RHS выполняется только в случае сбоя LHS (возвращает ненулевое значение).
вышеуказанные предложения по использованию "true" также будут работать, но неэффективны, поскольку "true" является внешней программой.