1

Я изучаю сценарии оболочки и застрял в этих маленьких экспериментальных сценариях оболочки:

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

Без сомнения, $ A в строке 3 и строке 4 отличаются друг от друга, что можно объяснить тем, что родительский процесс не может читать переменные, созданные в дочернем процессе, то есть подоболочке. Тем не менее, $ SHLVL в строке 3 и строке 4 - это ЖЕ, что я думал, что $ A в строке 3 должно быть больше, чем $ A в строке 4 на 1. Разве команды в строке 3 не выполняются в подоболочке? Я не знаю, где я неправильно истолковал.

Спасибо за вашу помощь.

2 ответа2

0

Ваш уровень оболочки не изменяется в скрипте, который вы сделали. Когда вы echo $SHLVL в вашем терминале, вы увидите текущий уровень запуска оболочки. Если вы используете команду bash в своем терминале, вы создадите подоболочку и повышаете уровень оболочки до тех пор, пока не выйдете из этого подоболочки. Подоболочка, которую вы создаете в своем скрипте, является дочерней по отношению к родительскому элементу, работающему на уровне оболочки родительского элемента. Вот почему $SHLVL одинаково в родительском и дочернем процессах.

0

В расширенном руководстве Bash-Scripting я нашел это:

В то время как внутренняя переменная $BASH_SUBSHELL указывает уровень вложенности подоболочки, переменная $SHLVL не показывает изменений внутри подоболочки.

Кажется правильным, это соответствует вашим результатам. С другой стороны, Справочное руководство Bash гласит:

SHLVL

Увеличивается на единицу каждый раз, когда запускается новый экземпляр Bash. Это должно быть подсчет того, насколько глубоко вложены ваши оболочки Bash.

Я признаю, что это может вводить в заблуждение. Я думаю, что "новый экземпляр Bash запущен", когда вы явно вызываете bash . Согласно этой интерпретации подоболочки типа (…) не учитываются; они рассматриваются как части оригинальной оболочки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .