Как я узнаю, что я запускаю вложенную оболочку? - PullRequest
58 голосов
/ 22 декабря 2010

При использовании * nix-оболочки (обычно bash) я часто порождаю вложенную оболочку, с помощью которой я могу позаботиться о небольшой задаче (обычно в другом каталоге), а затем выхожу из, чтобы возобновить сеанс родительской оболочки . * * 1001

Время от времени я теряю слежение за тем, запускаю ли я вложенную оболочку или в своей оболочке верхнего уровня, и случайно создаю дополнительную вложенную оболочку или выхожу из верхнего уровня оболочка по ошибке.

Есть ли простой способ определить, запущен ли я во вложенной оболочке? Или я решаю свою проблему (порождая вложенные оболочки) совершенно неправильно?

Ответы [ 7 ]

68 голосов
/ 22 декабря 2010

Переменная $SHLVL отслеживает уровень вложенности вашей оболочки:

$ echo $SHLVL
1
$ bash
$ echo $SHLVL
2
$ exit
$ echo $SHLVL
1

В качестве альтернативы порождению вложенных оболочек вы можете вставлять и извлекать каталоги из стека и оставаться в той же оболочке:

[root@localhost /old/dir]# pushd /new/dir
/new/dir /old/dir
[root@localhost /new/dir]# popd
/old/dir
[root@localhost /old/dir]#
22 голосов
/ 22 декабря 2010

Вот упрощенная версия части моего приглашения:

PS1='$(((SHLVL>1))&&echo $SHLVL)\$ '

Если я не во вложенной оболочке, она не добавляет ничего лишнего, но показывает глубину, если яна любом уровне вложенности.

11 голосов
/ 22 декабря 2010

Посмотрите на $0: если он начинается с минус -, вы находитесь в оболочке входа в систему.

8 голосов
/ 31 января 2014

pstree -s $$ очень полезно, чтобы увидеть вашу глубину.

1 голос
/ 02 ноября 2017

Переменная среды $SHLVL содержит «глубину» оболочки.

echo $SHLVL

Глубину оболочки также можно определить с помощью pstree (версия 23 и выше):

pstree -s $$ | grep sh- -o | wc -l

Я нашел второй способ более надежным, чем первый, значение которого было сброшено при использовании sudo или стало ненадежным при env -i.

Ни один из них не может правильно справиться с su.


Информация может быть доступна в вашем запросе:

PS1='\u@\h/${SHLVL} \w \$ '
PS1='\u@\h/$(pstree -s $$ | grep sh- -o | tail +2 | wc -l) \w \$ '

| tail +2 предназначен для удаления одной строки из вывода grep.Поскольку мы используем конвейер внутри подстановки команды "$(...)", оболочке необходимо вызвать под-оболочку, поэтому pstree сообщает об этом, и grep обнаруживает еще один уровень sh-.


InВ дистрибутивах Debian pstree является частью пакета psmisc.Возможно, он не установлен по умолчанию в дистрибутивах, отличных от настольных.

0 голосов
/ 22 декабря 2010

ptree $$ также покажет вам, насколько глубоко вы находитесь

0 голосов
/ 22 декабря 2010

Если вы работаете внутри под-оболочки, следующий код даст 2:

ps | fgrep bash | wc -l

В противном случае это приведет к 1.

РЕДАКТИРОВАТЬ Хорошо, это не такой надежный подход, как было указано в комментариях:)
Еще одна вещь, чтобы попробовать это

ps -ef | awk '{print $2, " ", $8;}' | fgrep $PPID 

выдаст 'bash', если вы находитесь в под-оболочке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...