Как разрешить bash subshell унаследовать параметры родительского набора?

Допустим, что я set -x в script "a.sh", и он вызывает другой script "b.sh".

Можно ли разрешить "b.sh" наследовать параметр -x из "a.sh"?

Ответы

Ответ 1

export SHELLOPTS

например:

echo date > b
chmod +x b

без экспорта, мы видим только команды в ./a, когда он вызывает ./b:

$ echo ./b > a
$ bash -xv a

./b
+ ./b
Sun Dec 29 21:34:14 EST 2013

но если мы экспортируем SHELLOPTS, мы увидим команды в ./a и ./b

$ echo "export SHELLOPTS; ./b" > a
$ bash -xv a

./b
+ ./b  date
++ date   
Sun Dec 29 21:34:36 EST 2013

Ответ 2

Так как -x не наследуется подоболочками, вам нужно быть более явным. Вы можете проверить, когда -x используется с специальным параметром $-.

if [[ $- = *x* ]]; then
    # Set the option, then *source* the script, in a subshell
    ( set -x; . b.sh )
else
    # Simply run the script; subshell automatically created.
    ./b.sh
fi

Ответ 3

Они будут включены в script b, если script b источники script a. Что может или не может решить вашу проблему для вас!

Ответ 4

Как и @devnull, вы можете использовать операцию . в script.

В a.sh

. SETVALUES

В b.sh

. SETVALUES

В SETVALUES

set -x

Когда вы вызываете SETVALUES, эти значения будут установлены в этой подколле.