Как знать “уровень” оболочек, в которых я нахожусь?

В ударе просто введите Высокий звук +#.

Затем, когда Вы готовы, нажмите Up затем Высокий звук +#.

Первое помещает a # в начале строки для превращения его в комментарий, затем принимает строку, как будто Вы нажали Enter.

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

Если второй раз просто вводит другого #, затем необходимо ввести Высокий звук +-Высокий звук +# вместо этого.

Можно заставить zsh сделать то же путем помещения

bindkey -M emacs '\e#' pound-insert

в Вашем ~/.zshrc.

Или при использовании vi привязки можно ввести # от командного режима и в ударе и в zsh.

32
17.10.2010, 12:18
5 ответов

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

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

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

6
27.01.2020, 19:37
  • 1
    Aaah... привязывается.. победите меня к нему. :) +1 –  Stefan 17.10.2010, 14:24
  • 2
    В настоящее время, я нахожусь на Mac и команде, давал мне ps: illegal option -- -, какая-либо идея, почему? Я протестирую его снова в Linux скоро :) –  phunehehe 17.10.2010, 15:00
  • 3
    @phunehehe: --option-name главным образом определенные для GNU функции, так главным образом не доступно в стандартных системных утилитах вне Linux. Но можно получить эффект ps --no-headers портативно путем добавления = после имени столбца. Также comm столбцом не является POSIX, но cmd столбец (который включает аргументы команды). Также -p необходимо перед PID в синтаксисе POSIX. Следовательно ps -o cmd= -p $PPID является портативным и дает подобную информацию. –  Gilles 'SO- stop being evil' 17.10.2010, 15:17
  • 4
    , работает над хинду –  phunehehe 17.10.2010, 17:09
  • 5
    @phunehehe: извините, я сделал ошибку в комментарии выше. На самом деле comm столбец указан POSIX и зарегистрирован на Mac OS X, тогда как cmd столбец существует на Linux, но не является стандартным. программное обеспечение –  Gilles 'SO- stop being evil' 17.10.2010, 21:29

Вы на самом деле натолкнулись на правильный термин ¹. Существует переменная среды SHLVL который все главные интерактивные оболочки (удар, 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.

38
27.01.2020, 19:37
  • 1
    спасибо за подтверждение термина. Я нахожусь все еще на Mac и удивлен найти, что те 2 команды дают тот же результат, независимо от моего уровня оболочки. –  phunehehe 17.10.2010, 15:08
  • 2
    @phunehehe: что 2 команды? Если Вы имеете в виду ps -o tty= -p$pid, это показывает терминал управления процесса, который определяет эмулятор терминала (xterm, экран, sshd, …), в котором работает процесс. Это не изменится, если Вы запустите оболочку с другой оболочки, но изменитесь при запуске нового эмулятора терминала. Если эмулятор терминала является собственным приложением Mac, может быть определенная для Mac тонкость, о которой я не знаю. –  Gilles 'SO- stop being evil' 17.10.2010, 15:14
  • 3
    ps -o tty= -p$$ и ps -o tty= -p$PPID , потому что Вы сказали, что они должны произвести другой вывод. Или я неправильно понимал что-то? –  phunehehe 17.10.2010, 15:44
  • 4
    @phunehehe: Они дают другой вывод когда, если родительский процесс оболочки является эмулятором терминала, потому что эмулятор терминала не имеет своего эмулированного терминала как терминала управления. Если Вы находите иначе, отправьте вывод ps -p $$ -p $PPID (снова, у меня нет опыта OSX, поэтому возможно, существует что-то необычное продолжение на OSX). подтвержденный –  Gilles 'SO- stop being evil' 17.10.2010, 15:53
  • 5
    @Gilles: это было действительно чем-то необычным с OSX. Я протестировал на хинду, и все было корректно, как Вы сказали. На OSX, ps -p $$ -p $PPID дает (извините, я не знаю, как отформатировать комментарии), PID-pf phunehehe 210 ttys000 0:00.12 входа в систему времени CMD 209 ttys000 0:00.01 TTY - удар –  phunehehe 17.10.2010, 17:14

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

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

И используйте это для выведения суммы оболочек, из которых необходимо будет выйти, прежде, чем прибыть в "корневую" оболочку

1
27.01.2020, 19:37

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

echo "$SHLVL"
1
27.01.2020, 19:37

Я считаю, что

$ pstree -u | grep ${USER}

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

Время от времени это будет напоминать мне, что я оставил nohupзадание работающим или подобное.

(Кроме того, я использую alias grep='grep --color=auto'.)

0
27.01.2020, 19:37

Теги

Похожие вопросы