Bash источник не срабатывает при errexit, по какой причине? - PullRequest
1 голос
/ 16 июня 2020
• 1000 если есть.

s1. sh

#!/bin/bash
num=1
if [ $num -eq 1 ]; then
    FOO="$(set -o | grep -e "errexit" -e "nounset" | grep off >&2)"
    VAR="SOME/TEXT/$(basename "$UNBOUND_VARIABLE")"
    RET="$(echo $?)"
    #ERR="$UNBOUND_VARIABLE" # this will be trapped and source will exit at this line
    BAR="LAST_IS_GOOD"
fi

s2. sh

function source_all
{
    local __f
    set -exu
    for __f in ${@}; do
        case "$__f" in
            "s1.sh" ) set -o posix; (source "$(pwd)/$__f") || return 1; echo "$$ $?" >&2 ;;
        esac
    done
    set +eux +o posix
}

function main
{
    source_all s1.sh || return 1
}

main

вывод

+ for __f in ${@}
+ case "$__f" in
+ set -o posix
++ pwd
+ source (blah/blah)/s1.sh
++ num=1
++ '[' 1 -eq 1 ']'
+++ set -o
+++ grep -e errexit -e nounset
+++ grep off
++ FOO=
(blah/blah)/s1.sh: line 6: UNBOUND_VARIABLE: unbound variable # should exit
++ VAR=SOME/TEXT/
+++ echo 1
++ RET=1
++ BAR=LAST_IS_GOOD 
+ echo '9568 0'
9568 0
+ set +eux +o posix

источник - help

    Exit Status:
    Returns the status of the last command executed in FILENAME; fails if
    FILENAME cannot be read.

вопрос: почему source вызывается в s2. sh не возвращает 1? Почему он продолжает обрабатывать s1. sh после UNBOUND_VARIABLE?

спасибо за ваш ввод

1 Ответ

4 голосов
/ 16 июня 2020

Ошибка UNBOUND VARIABLE возникает из-за того, что вы используете set -u, ссылаетесь с $UNBOUND_VARIABLE на переменную с именем _UNBOUND_VARIABLE_, которая не была назначена, в операторе

VAR="SOME/TEXT/$(basename "$UNBOUND_VARIABLE")"

. set -e имеет эффект , так как подоболочка this выполняется, т.е.

(source "$(pwd)/$__f")

прерывается. Хотя подоболочка из-за этого прерывания действительно возвращается с ненулевым кодом выхода, но это не запускает выход из родительского процесса, потому что у вас есть || return справа. По той же причине команда

false || echo x

не завершит выполнение, даже если одиночная

false

завершит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...