Иногда я делаю такие вещи, как запуск суб-оболочки из vim с помощью :sh
. Как я узнаю, что если я нахожусь в под-оболочке, где exit
просто верну меня на один уровень, вместо того, чтобы находиться во внешней оболочке, где exit
я выйду из системы или закрою сеанс.
Есть ли какой-нибудь тотем Начала, который я могу вращать, или что-то, чтобы узнать, на каком уровне я нахожусь?
command-line
Уик
источник
источник
echo $0
. Если это оболочка верхнего уровня, она, вероятно, начнется с тире. (Это верно, по крайней мере, для bash, а dash означает, что это так называемая оболочка входа в систему.)Ответы:
Вы можете использовать команду
pstree
(которая поставляется по умолчанию с Ubuntu). Вот пример - в настоящее время у меня только одно открытое окно терминала на WSL:В реальной среде Linux / Ubuntu дерево процессов будет более сложным. Мы можем отфильтровать дерево с помощью опции
-s
, которая покажет родителей выбранного процесса. Таким образом, наша команда может бытьpstree -s $$
где$$
переменная окружения, которая содержит текущий PID:Ссылки:
Добавить индикатор оболочечной подсказки: Основанные на @ waltinator по идее , для того , чтобы иметь счетчик в передней части подсказки для нескольких различных оболочек , когда уровень глубже , чем один, я добавил строки, показанные ниже дем, внизу соответствующих файлов команд запуска (
~/.*rc
).Я провел тесты на WSL, Ubuntu 16.04, Ubuntu 18.04 (сервер / рабочий стол), Ubuntu 19.04, в рамках сеансов gnome-terminal, tty и ssh. Вот как это работает:
Ограничение: счетчик работает только на 13-14 уровнях глубины, в зависимости от ОС. Я не собираюсь расследовать причины :)
bash
>.bashrc
:csh
иtcsh
>.cshrc
:zsh
>.zshrc
:ksh
>.kshrc
:sh
это на самом делеdash
на Ubuntu - здесь все немного сложнее и запутаннее (см. ссылки ниже для получения дополнительной информации):Отредактируйте
~/.profile
файл и добавьте следующую строку внизу:Создайте файл
~/.shrc
со следующим содержанием, примечаниеksh
также гласит$ENV
:Ссылки:
.profile
и.kshrc
Создайте команду, которая выведет глубину. Другой вариант - создать команду оболочки, которая выведет глубину. Для этого создайте исполняемый файл (таким образом, он должен быть доступен для всей системы):
/usr/local/bin/depth
Отредактируйте файл в вашем любимом редакторе и добавьте следующие строки в качестве его содержимого:
Данный скрипт имеет два варианта ,
-v
или ,--verbose
что выход будет список задействованных оболочек. И еще одна опция, которая будет проверять, будет ли глубина больше единицы, и на основании этого будет возвращатьсяexit 0
илиexit 1
, так что вы можете использовать ее таким образомdepth && exit
. Вот несколько примеров использования:Сравнение с другими решениями: я потратил дополнительное время, чтобы выяснить некоторые слабые стороны подходов, представленных здесь. Мне удалось представить следующие два случая (заглавные буквы нужны для лучшей подсветки синтаксиса):
Когда
su
илиsudo -i
участвуют:Когда там запускается фоновый процесс:
источник
systemd───xfce4-terminal───bash───pstree
. Почему так?xfce4-terminal
, который запустилbash
оболочку, внутри которой вы запустилиpstree
, которая сообщила о себе и своих родителях. Если вы имеете в виду отсутствие шагов между systemd и xfce4-терминал, то может случиться так, что любой запущенный xfce4-терминал умрет или откажется от него, и в этом случае он будет унаследован init.SHLVL
? Переносимость между процессами и системами, я полагаю, но тогда pstree может быть не установлена ..$SHLVL
не поддерживаются некоторыми оболочками. Более конкретно, в соответствии с окружающей средой из приведенной выше демонстрации он не поддерживается толькоsh
(dash
) - и эта оболочка вообще не учитывается этой переменной. С другой стороны,pstree
это часть пакета psmisc, который также предоставляетfuser
,killall
и несколько других - это основной компонент Ubuntu - я не устанавливал его в системах, упомянутых в этом ответе.Проверьте значение
SHLVL
переменной оболочки:Цитирование со
bash
страницы руководства России:Это также поддерживается
zsh
.источник
:sh
я думаю, что по умолчанию используется оболочка входа пользователя (это сокращенная форма,:shell
а не имя конкретного двоичного:sh
отvim
прежде чем отправлять этот ответ, и он сделал приращение уровня оболочки для меня. Мой логин оболочки bash.По моему
.bashrc
, я использую$SHLVL
для корректировки$PS1
, добавляя+
знаки " " к моей$SUBSHELL
переменной:Тогда я вижу, насколько я глубоко:
источник
AWK:
pgrep:
Вы можете поместить одну из двух версий в файл и использовать источник, чтобы сделать доступным $ DEPTH.
источник
Вы можете просто использовать
ps
без каких-либо дополнительных аргументов, чтобы увидеть весь стек оболочки (включая текущий). Он также будет показывать все фоновые задания, которые вы запустили, а такжеps
сам, но он может дать вам приблизительную оценку того, насколько вы глубоки.источник
{ echo hello world; ps; } &
чтобы доказатьps
ответ выше.