Как отключить set -e для отдельной команды?

Как отключить set -e для отдельной команды?

Команда set -e немедленно завершает работу bash-скрипта, если любая команда возвращает ненулевой код завершения.

  1. Есть ли простой и элегантный способ отключить такое поведение для отдельной команды в скрипте?

  2. В каких местах в справочном руководстве Bash задокументирована эта функциональность (http://www.gnu.org/software/bash/manual/bashref.html)?

решение1

  1. Что-то вроде этого:

    #!/usr/bin/env bash
    
    set -e
    echo hi
    
    # disable exitting on error temporarily
    set +e
    aoeuidhtn
    echo next line
    
    # bring it back
    set -e
    ao
    
    echo next line
    

    Бегать:

    $ ./test.sh
    hi
    ./test.sh: line 7: aoeuidhtn: command not found
    next line
    ./test.sh: line 11: ao: command not found
    
  2. Это описано во setвстроенной справке:

    $ type set
    set is a shell builtin
    $ help set
    (...)
    Using + rather than - causes these flags to be turned off.
    

То же самое задокументировано здесь:https://www.gnu.org/software/bash/manual/bashref.html#The-Set-Builtin.

решение2

Альтернативой отмене залога по ошибке было бы принудительное достижение успеха, несмотря ни на что. Вы можете сделать что-то вроде этого:

cmd_to_run || true

Это вернет 0 (истина), поэтому set -e не должен срабатывать.

решение3

Если вы пытаетесь перехватить код возврата/ошибки (функции или форка), это сработает:

function xyz {
    return 2
}

xyz && RC=$? || RC=$?

решение4

Другой подход, который я нахожу довольно простым (и применим к другим setвариантам в дополнение к -e):

Используйте $-для восстановления настроек.

Например:

oldopt=$-
set +e
# now '-e' is definitely disabled.
# do some stuff...

# Restore things back to how they were
set -$oldopt

Хотя -eконкретно варианты, упомянутые другими ( || trueили «поместить внутрь if»), могут быть более идиоматичными.

Связанный контент