$ SHLVL nie rośnie (echo $ SHLVL)

1

Uczę się skryptów powłoki i utknąłem w tych małych eksperymentalnych skryptach powłoki:

1 #!/usr/bin/env bash
2 A=1
3 (A=2;echo "A is $A in $SHLVL")
4 echo "A is $A in $SHLVL"
5 exit 0

Bez wątpienia $ A w wierszu 3 i wierszu 4 różnią się od siebie, co można wytłumaczyć, ponieważ dzieje się tak, ponieważ proces nadrzędny nie może odczytać zmiennych utworzonych w procesie potomnym, czyli podpowłoce. Jednak $ SHLVL w linii 3 i linii 4 są takie same, co myślałem, że $ A w linii 3 powinien być większy niż $ A w linii 4 o 1. Czy polecenia w linii 3 nie były wykonywane w podpowłoce? Nie wiem, gdzie źle zinterpretowałem.

Dzięki za pomoc.

Han XIAO
źródło

Odpowiedzi:

0

Poziom powłoki nie zmienia się w utworzonym skrypcie. Gdy znajdziesz się echo $SHLVLw terminalu, zobaczysz aktualny poziom uruchomienia powłoki. Jeśli użyjesz polecenia bashw swoim terminalu, utworzysz podpowłokę i zwiększysz poziom powłoki, dopóki nie wyjdziesz z tej podpowłoki. Utworzona w skrypcie podpowłoka jest dzieckiem rodzica działającym na poziomie powłoki rodzica. Dlatego tak $SHLVLsamo jest w procesach nadrzędnych i podrzędnych.

wprowadź opis zdjęcia tutaj

Jokai
źródło
0

W Advanced Guide Bash-Scripting Guide znalazłem to:

Podczas gdy $BASH_SUBSHELLzmienna wewnętrzna wskazuje poziom zagnieżdżenia podpowłoki, $SHLVLzmienna nie wykazuje zmian w podpowłoce.

Wydaje się słuszne, pasuje do twoich wyników. Z drugiej strony Bash Reference Manual mówi:

SHLVL

Zwiększany o jeden za każdym razem, gdy uruchamiana jest nowa instancja Bash. Ma to na celu zliczenie głębokości zagnieżdżenia pocisków Bash.

Przyznaję, że może to wprowadzać w błąd. Myślę, że „uruchamiana jest nowa instancja Bash”, gdy jawnie się wywołujesz bash. Zgodnie z tą interpretacją podpowłoki (…)nie liczą się; są traktowane jako części oryginalnej powłoki.

Kamil Maciorowski
źródło