Załóżmy, że robię set -x
w skrypcie "a.sh" i wywołuje on inny skrypt "b.sh".Jak pozwolić podsystemowi Bash na dziedziczenie opcji zestawu rodzica?
Czy można "b.sh" dziedziczyć opcję -x
z "a.sh"?
Załóżmy, że robię set -x
w skrypcie "a.sh" i wywołuje on inny skrypt "b.sh".Jak pozwolić podsystemowi Bash na dziedziczenie opcji zestawu rodzica?
Czy można "b.sh" dziedziczyć opcję -x
z "a.sh"?
export SHELLOPTS
na przykład:
echo date > b
chmod +x b
bez eksportu, widzimy tylko te polecenia w ./a
gdy wywołuje ./b
:
$ echo ./b > a
$ bash -xv a
./b
+ ./b
Sun Dec 29 21:34:14 EST 2013
ale jeśli eksportujemy SHELLOPTS, my zobacz polecenia w ./a
i ./b
$ echo "export SHELLOPTS; ./b" > a
$ bash -xv a
./b
+ ./b date
++ date
Sun Dec 29 21:34:36 EST 2013
Niestety, "zmiany muszą mieć co najmniej 6 znaków", więc nie mogę poprawić bezpośrednio wpisu. Dobry przykład tego, jak w programowaniu zmiana jednego znaku może być na tyle "znaczna", aby oszczędzić czytelnikom dużo bólu./SHELLOPT [^ S]/s/SHELLOPT/SHELLOPTS/ –
To nie działa dla 'set -e' i podpowłoki w' $ (...) ':' bash4 -c 'set -eC; set -o pipefail; eksport SHELLOPTS; f() {false; echo cześć; }; foo = (bar "$ (f)"); echo end'' podczas gdy beahvior z jawnym '$ (set -e; ...)' jest inny: 'bash4 -c 'set -eC; set -o pipefail; f() {false; echo cześć; }; foo = (pasek "$ (set -e; f)"); echo end'' –
To jest świetne, ale jak można odziedziczyć 'PS4'? Wyeksportowałem to. –
Zostaną one włączone do skryptu b, jeśli skrypt b sources skrypt a. Co może, ale nie musi, rozwiązać Twój problem!
Podobnie jak @devnull powiedział, że możesz użyć operacji .
w swoim skrypcie.
W A.sh
. SETVALUES
W B.SH
. SETVALUES
W SETVALUES
set -x
Gdziekolwiek powołać SET VALUES, te wartości zostaną ustawione w tej podrzędnej powłoce.
Od -x
nie jest dziedziczona przez podpowłoki, musisz być nieco bardziej wyraźny. Możesz przetestować, kiedy -x
jest używany z parametrem specjalnym $-
.
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
Użyj '.' lub' source', aby wywołać 'b.sh'. – devnull