bash: `set -e` не работает при использовании в выражении if? - PullRequest
3 голосов
/ 03 февраля 2020

Взгляните на этот маленький скрипт:

#!/bin/bash

function do_something() {(
    set -e

    mkdir "/opt/some_folder"                                     # <== returns 1 -> abort?
    echo "mkdir returned $?"                                     # <== sets $0 to 0 again

    rsync $( readlink -f "${BASH_SOURCE[0]}" ) /opt/some_folder/ # <== returns 23 -> abort?
    echo "rsync returned $?"                                     # <== sets $0 to 0 again
)}


# here  every command inside `do_something` will be executed - regardless of errors
echo "run do_something in if-context.."
if ! do_something ; then
  echo "running do_something did not work"
fi

# here `do_something` aborts on first error
echo "run do_something standalone.."
do_something
echo $?

Я пытался сделать то, что было предложено здесь (не пропустите дополнительные скобки, вводящие под-оболочку), но Я не выполнял функцию (do_something в моем случае) отдельно, но вместе с выражением if.

Теперь, когда я запускаю if ! do_something, команда set -e, кажется, не имеет никакого эффекта.

Может кто-нибудь объяснить мне это?

1 Ответ

4 голосов
/ 03 февраля 2020

Это ожидается и описано в Bash Справочном руководстве .

-e

[...] Оболочка не завершает работу, если сбойная команда является частью списка команд, следующего сразу за ключевым словом while или until, частью теста в операторе if, [...] .

[...]

Если составная команда или функция оболочки выполняется в контексте, где -e игнорируется, ни одна из команд, выполненных в на составную команду или тело функции будет влиять настройка -e, даже если установлено -e и команда возвращает состояние ошибки. Если составная команда или функция оболочки задает -e во время выполнения в контексте, где -e игнорируется, этот параметр не будет иметь никакого эффекта, пока составная команда или команда, содержащая вызов функции, не завершится.

...