Игнорируя конкретные ошибки в 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" является внешней программой.