Если я открою терминал, как у xterm
меня будет оболочка. Тогда, если я использую ssh
или у zsh
меня будет другой «уровень» оболочки. Есть ли способ узнать, сколько раз я должен Ctrl+D
или напечатать, exit
чтобы выйти из них всех? Мое настоящее намерение - выйти из всего, кроме «корневой» оболочки.
Также было бы полезно узнать, как мультиплексоры терминалов (например screen
) влияют на решение.
PS: Пожалуйста, не стесняйтесь менять название, я не знаю, правильные ли это термины.
ps: illegal option -- -
, есть идеи, почему? Скоро--option-name
это в основном специфичные для GNU функции, поэтому в большинстве системных утилит за пределами Linux они недоступны. Но вы можете получить эффектps --no-headers
переносимости, добавив=
после имени столбца. Такжеcomm
столбец не POSIX, аcmd
столбец (который включает аргументы команды). Также-p
необходимо перед синтаксисом PID в POSIX. Следовательно,ps -o cmd= -p $PPID
является портативным и дает аналогичную информацию.comm
столбец указан в POSIX и задокументирован в Mac OS X, тогда какcmd
столбец существует в Linux, но не является стандартным.Вы действительно нашли правильный термин ». Существует переменная среды, в
SHLVL
которой все основные интерактивные оболочки (bash, tcsh, zsh) увеличиваются на 1 при запуске. Так что если вы запускаете оболочку внутри оболочки,SHLVL
увеличивается на 1.Однако это не отвечает вашим интересам, потому что
SHLVL
переносит такие вещи, как эмуляторы терминала. Например, в моей типичной конфигурации значение$SHLVL
2 в xterm, потому что уровень 1 соответствует оболочке, которая выполняет мой сеанс X (~/.xinitrc
или~/.xsession
).Что я делаю, так это отображаю
$SHLVL
в моем приглашении, но только если родительский процесс оболочки - это другая оболочка (с эвристикой типа «если ее имя заканчиваетсяsh
плюс необязательные знаки пунктуации и цифры, это оболочка»). Таким образом, у меня есть очевидная визуальная индикация в необычном случае оболочки, запущенной под другой оболочкой.Может быть, вы бы предпочли обнаружить оболочки, которые работают непосредственно под эмулятором терминала. Вы можете сделать это довольно точно: эти оболочки которых родительский процесс имеет другой контрольный терминал, так что
ps -o tty= -p$$
иps -o tty= -p$PPID
производить различную продукцию. Вы можете вручную сброситьSHLVL
до 1 в этих оболочках или установить свой собственныйTERMSHLVL
в 1 в этих оболочках (и увеличить в противном случае).¹ Хотя никто бы не подумал, что смотрит на страницы справочника: ни одна из трех оболочек, которые его поддерживают, не включает слово «уровень» в документацию
SHLVL
.источник
ps -o tty= -p$pid
, это показывает управляющий терминал процесса, который идентифицирует эмулятор терминала (xterm, screen, sshd,…), в котором выполняется процесс. Он не изменится, если вы запустите оболочку из другой оболочки, но изменится, если вы запустить новый эмулятор терминала. Если эмулятор терминала является родным приложением Mac, возможно, у меня есть тонкость, характерная для Mac, о которой я не знаю.ps -o tty= -p$$
иps -o tty= -p$PPID
, потому что вы сказали, что они должны производить разные результаты. Или я что-то не так понял?ps -p $$ -p $PPID
(опять же, у меня нет опыта работы с OSX, поэтому, возможно, что-то необычное происходит в OSX).ps -p $$ -p $PPID
выдает (извините, я не знаю, как форматировать комментарии) PID TTY TIME CMD 209 ttys000 0: 00.01 login -pf phunehehe 210 ttys000 0:Не очень элегантно, но вы можете использовать древовидное представление в htop, чтобы увидеть отношения родитель-потомок вашей оболочки с другими запущенными процессами.
И используйте это, чтобы определить количество оболочек, которое вам нужно будет выйти, прежде чем вы попадете в «корневую» оболочку.
источник
Вы можете использовать переменную окружения SHLVL :
источник
ssh
например, для той же учетной записи, это все равно будет1
Я нахожу это
может быть очень полезным, чтобы увидеть, где я "вписываюсь" в систему. Я предпочитаю это
pstree -u ${USER}
.Иногда это будет напоминать мне, что я оставил
nohup
работу или что-то подобное.(Также пользуюсь
alias grep='grep --color=auto'
.)источник