Подтвердить что ты не робот

Игнорирование определенных ошибок в сценарии оболочки

У меня есть небольшой фрагмент оболочки script, который может вызвать много ошибок. У меня есть script, который в настоящий момент установлен для глобальной остановки при всех ошибках. Однако я хотел бы, чтобы этот небольшой подраздел несколько отличался.

Вот фрагмент:

recover database using backup controlfile until cancel || true; 
auto

Я ожидаю, что это приведет к ошибке "файл не найден". Однако я бы хотел продолжить выполнение этой ошибки. Для любой другой ошибки я хотел бы остановить script.

Каким будет лучший способ достижения этого?

Bash Версия 3.00.16

4b9b3361

Ответ 1

Чтобы предотвратить bash игнорировать ошибку для определенных команд, вы можете сказать:

some-arbitrary-command || true

Это приведет к продолжению script. Например, если у вас есть следующий script:

$ 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

Цитата из manual:

Сбой не завершается, если команда, которая не работает, является частью список команд сразу после ключевого слова while или until, часть тест в выражении if, часть любой команды, выполненной в && или ||, кроме команды, следующей за окончательной && или ||, любая команда в конвейере, но последний, или если статус возврата команд перевернутый с помощью !. Ловушка на ERR, если установлена, выполняется перед оболочкой выходов.

РЕДАКТИРОВАТЬ: Чтобы изменить поведение таким образом, чтобы в выполнении продолжалось, только если выполнение 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 не был.

Ответ 2

Использование:

command || :

: встроенный bash, который всегда возвращает успех. И, как обсуждалось выше, || короткое замыкание, поэтому RHS выполняется только в случае сбоя LHS (возвращает ненулевое значение).

Вышеуказанные предложения по использованию "истины" также будут работать, но неэффективны, поскольку "истина" - это внешняя программа.