Переменная $ SHLVL используется, чтобы сообщить вам, сколько у вас глубоких оболочек. Если вас это смущает, стоит начать с самого начала.
Что такое оболочка?
Оболочка принимает команды и передает их основной операционной системе для выполнения. В большинстве систем Linux программа оболочки называется BASH (оболочка Bourne Again), но есть и другие, включая оболочку C (tcsh) и оболочку KORN (ksh).
Как получить доступ к оболочке Linux
Как правило, пользователь взаимодействует с программой оболочки с помощью программы эмуляции терминала, такой как XTerm, konsole или gnome-terminal.
Если вы используете диспетчер Windows, такой как Openbox, или среду рабочего стола, такую как GNOME или KDE, вы найдете эмулятор терминала из меню или из тире. Во многих системах комбинации клавиш CTRL ALT и T также открывают окно терминала.
Кроме того, вы можете переключиться на другой TTY (телетайп), который обеспечивает прямой доступ к оболочке командной строки. Вы можете сделать это, нажав клавиши CTRL ALT и F1 или клавиши CTRL ALT и F2 и т. Д.
Что такое уровень оболочки
Когда вы запускаете команду в оболочке, она запускается на уровне, называемом уровнем оболочки. Внутри оболочки вы можете открыть другую оболочку, которая делает ее подоболочкой, или оболочку, которая ее открыла.
Следовательно, родительская оболочка может рассматриваться как оболочка уровня 1, а дочерняя оболочка – оболочкой уровня 2.
Как отобразить уровень оболочки
Исходя из названия статьи, неудивительно, что вы можете определить, на каком уровне оболочки вы работаете, используя переменную $ SHLVL.
Чтобы увидеть уровень оболочки, который вы сейчас используете, наберите следующее:
echo $ SHLVL
Интересно, что если вы запустите указанную выше команду в окне терминала, вы можете быть удивлены, увидев, что возвращаемый результат равен 2.
Однако, если вы запускаете ту же команду, используя tty, то результатом будет 1.
Почему это так, спросите вы? Итак, среда рабочего стола, которую вы используете, запускается поверх оболочки. Эта оболочка будет уровня 1. Любое окно терминала, которое вы открываете из среды рабочего стола, должно быть дочерним элементом оболочки, которая открыла среду рабочего стола, и поэтому уровень оболочки не может начинаться с любого числа, кроме 2.
Tty не работает в среде рабочего стола и поэтому является просто оболочкой уровня 1.
Как создать подоболочки
Самый простой способ проверить концепцию оболочек и подоболочек заключается в следующем. Откройте окно терминала и введите следующее:
echo $ SHLVL
Как мы знаем из окна терминала, минимальный уровень оболочки равен 2.
Теперь в окне терминала введите следующее:
ш
Сама команда sh запускает интерактивную оболочку, что означает, что вы используете оболочку внутри оболочки или подоболочку.
Если вы сейчас наберете это снова:
echo $ SHLVL
Вы увидите, что уровень оболочки установлен на 3. Выполнение команды sh из подоболочки откроет подоболочку подоболочки и уровень оболочки будет на уровне 4.
Почему важен уровень Shell?
Уровень оболочки важен, когда вы думаете о области действия переменных в ваших скриптах.
Давайте начнем с чего-то простого:
dog = maisie
echo $ dog
Если вы запустите указанную выше команду в оболочке, в окне терминала появится слово maisie.
Откройте новую оболочку, набрав следующее:
ш
Если вы запустите эту команду, вы увидите, что на самом деле ничего не возвращается:
echo $ dog
Это связано с тем, что переменная $ dog доступна только на уровне оболочки 2. Если вы введете команду exit для выхода из подоболочки и снова запустите echo $ dog, снова появится слово maisie.
Также стоит подумать о поведении глобальных переменных внутри оболочки.
Начните с нового окна терминала и введите следующее:
export dog = maisie
echo $ dog
Как и следовало ожидать, слово Мейси отображается. Теперь откройте подоболочку и снова введите echo $ dog. На этот раз вы увидите, что слово maisie отображается, даже если вы находитесь в подоболочке.
Причина этого в том, что команда export сделала переменную $ dog глобальной. Изменение переменной $ dog в подоболочке, даже если вы используете команду export, не влияет на ее родительские оболочки.
Надеемся, что из этого вы можете видеть, что знание уровня оболочки, в которой вы работаете, имеет некоторое значение при написании скриптов.
Приведенные мною примеры очень упрощены, но для одного сценария оболочки довольно часто вызывается другой сценарий оболочки, который, в свою очередь, вызывает другой сценарий оболочки, и все они теперь работают на разных уровнях. Знание уровня оболочки может быть очень важным.