Как узнать «уровень» снарядов, в которых я нахожусь?

32

Если я открою терминал, как у xtermменя будет оболочка. Тогда, если я использую sshили у zshменя будет другой «уровень» оболочки. Есть ли способ узнать, сколько раз я должен Ctrl+Dили напечатать, exitчтобы выйти из них всех? Мое настоящее намерение - выйти из всего, кроме «корневой» оболочки.

Также было бы полезно узнать, как мультиплексоры терминалов (например screen) влияют на решение.

PS: Пожалуйста, не стесняйтесь менять название, я не знаю, правильные ли это термины.

phunehehe
источник

Ответы:

6

Один (по общему признанию, не идеальный) способ - добавить результат ps --no-headers -o comm $PPIDв приглашение командной строки. Это скажет вам имя процесса, который породил вашу оболочку. Если вы находитесь во вложенном zsh, он скажет "zsh". Если вы находитесь внутри zsh верхнего уровня, он будет читать «xterm» или «screen» или что-то еще, в чем работает ваша оболочка.

Чтобы определить, находитесь ли вы в сеансе ssh или su, вы можете просто посмотреть на имя хоста и имя пользователя в вашей подсказке.

Когда вы работаете с вложенными экранами (что я не думаю, что это обычная ситуация), я никак не могу вспомнить, находитесь ли вы в оболочке верхнего уровня во вложенном экране или в оболочке верхнего уровня экрана верхнего уровня. Вы можете настроить экран так, чтобы он всегда отображал строку состояния, что приведет к отображению нескольких строк состояния, если вы находитесь на вложенных экранах.

sepp2k
источник
Ааа ... огрызайся .. бей меня к этому. :) +1
Стефан
В настоящее время я на Mac и команда дала мне ps: illegal option -- -, есть идеи, почему? Скоро
попробую
3
@phunehehe: --option-nameэто в основном специфичные для GNU функции, поэтому в большинстве системных утилит за пределами Linux они недоступны. Но вы можете получить эффект ps --no-headersпереносимости, добавив =после имени столбца. Также commстолбец не POSIX, а cmdстолбец (который включает аргументы команды). Также -pнеобходимо перед синтаксисом PID в POSIX. Следовательно, ps -o cmd= -p $PPIDявляется портативным и дает аналогичную информацию.
Жиль "ТАК - перестань быть злым"
подтвердил, работает на Gentoo
phunehehe
2
@phunehehe: извините, я допустил ошибку в комментарии выше. Фактически commстолбец указан в POSIX и задокументирован в Mac OS X, тогда как cmdстолбец существует в Linux, но не является стандартным.
Жиль "ТАК - перестать быть злым"
37

Вы действительно нашли правильный термин ». Существует переменная среды, в SHLVLкоторой все основные интерактивные оболочки (bash, tcsh, zsh) увеличиваются на 1 при запуске. Так что если вы запускаете оболочку внутри оболочки, SHLVLувеличивается на 1.

Однако это не отвечает вашим интересам, потому что SHLVLпереносит такие вещи, как эмуляторы терминала. Например, в моей типичной конфигурации значение $SHLVL2 в xterm, потому что уровень 1 соответствует оболочке, которая выполняет мой сеанс X ( ~/.xinitrcили ~/.xsession).

Что я делаю, так это отображаю $SHLVLв моем приглашении, но только если родительский процесс оболочки - это другая оболочка (с эвристикой типа «если ее имя заканчивается shплюс необязательные знаки пунктуации и цифры, это оболочка»). Таким образом, у меня есть очевидная визуальная индикация в необычном случае оболочки, запущенной под другой оболочкой.

Может быть, вы бы предпочли обнаружить оболочки, которые работают непосредственно под эмулятором терминала. Вы можете сделать это довольно точно: эти оболочки которых родительский процесс имеет другой контрольный терминал, так что ps -o tty= -p$$и ps -o tty= -p$PPIDпроизводить различную продукцию. Вы можете вручную сбросить SHLVLдо 1 в этих оболочках или установить свой собственный TERMSHLVLв 1 в этих оболочках (и увеличить в противном случае).

¹ Хотя никто бы не подумал, что смотрит на страницы справочника: ни одна из трех оболочек, которые его поддерживают, не включает слово «уровень» в документацию SHLVL.

Жиль "ТАК - перестань быть злым"
источник
Спасибо за подтверждение срока. Я все еще на Mac и удивлен, обнаружив, что эти 2 команды дают одинаковый результат, независимо от уровня моей оболочки.
phunehehe
@phunehehe: какие 2 команды? Если вы имеете в виду ps -o tty= -p$pid, это показывает управляющий терминал процесса, который идентифицирует эмулятор терминала (xterm, screen, sshd,…), в котором выполняется процесс. Он не изменится, если вы запустите оболочку из другой оболочки, но изменится, если вы запустить новый эмулятор терминала. Если эмулятор терминала является родным приложением Mac, возможно, у меня есть тонкость, характерная для Mac, о которой я не знаю.
Жиль "ТАК - перестань быть злым"
ps -o tty= -p$$ и ps -o tty= -p$PPID , потому что вы сказали, что они должны производить разные результаты. Или я что-то не так понял?
phunehehe
@phunehehe: они дают различный вывод, если родительский процесс оболочки является эмулятором терминала, потому что эмулятор терминала не имеет своего эмулируемого терминала в качестве управляющего терминала. Если вы обнаружите иное, пожалуйста, опубликуйте вывод ps -p $$ -p $PPID(опять же, у меня нет опыта работы с OSX, поэтому, возможно, что-то необычное происходит в OSX).
Жиль "ТАК - перестань быть злым"
@ Жиль: это было действительно что-то необычное с OSX. Я тестировал на Gentoo, и все было правильно, как вы сказали. На OSX ps -p $$ -p $PPIDвыдает (извините, я не знаю, как форматировать комментарии) PID TTY TIME CMD 209 ttys000 0: 00.01 login -pf phunehehe 210 ttys000 0:
00.12 -bash
1

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

$ htop # then press 't' and scroll around or 'Ctrl-W' to find your shell proccess

И используйте это, чтобы определить количество оболочек, которое вам нужно будет выйти, прежде чем вы попадете в «корневую» оболочку.

Стефан
источник
1

Вы можете использовать переменную окружения SHLVL :

echo "$SHLVL"
Alex
источник
1
Если вы используете, sshнапример, для той же учетной записи, это все равно будет1
Anthon
0

Я нахожу это

$ pstree -u | grep ${USER}

может быть очень полезным, чтобы увидеть, где я "вписываюсь" в систему. Я предпочитаю это pstree -u ${USER}.

Иногда это будет напоминать мне, что я оставил nohupработу или что-то подобное.

(Также пользуюсь alias grep='grep --color=auto'.)

J_H
источник