2013-07-25 7 views

Odpowiedz

20
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 
+0

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/ –

+0

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'' –

+0

To jest świetne, ale jak można odziedziczyć 'PS4'? Wyeksportowałem to. –

0

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!

+0

Dziękuję za odpowiedź, ale wtedy b nie byłby podpowłoką. Czy znasz sposób, w jaki wykonujesz go jako polecenie zamiast go pozyskiwać? – dspjm

+0

@dspjm Nie może się zdarzyć w podpowłoce. – devnull

0

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.

3

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 
Powiązane problemy