Як дізнатися "рівень" снарядів, в яких я перебуваю?


32

Якщо я відкрию термінал, як у xtermмене буде оболонка. Тоді якщо я використовую sshабо у zshмене буде ще один "рівень" оболонки. Чи є спосіб дізнатися, скільки разів я повинен Ctrl+Dабо набрати, exitщоб вийти з них? Мій реальний намір - вийти з усього, крім оболонки "root".

Буде також непогано знати, який ефект (и) кінцевих мультиплексорів (подібних screen) надають на рішення

PS: Будь ласка, не соромтеся змінити назву, я не знаю, чи це правильні умови.

Відповіді:


6

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

Щоб сказати, чи перебуваєте ви в сеансі ssh чи su, ви можете просто переглянути ім’я хоста та ім’я користувача, що надходять у ваш запит.

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


Ааа ... оснастка .. побий мене до цього. :) +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, екран, sshd,…), у якому запущений процес. Він не зміниться, якщо ви запустите оболонку з іншої оболонки, але зміниться, якщо ви запустіть новий емулятор терміналу. Якщо емулятор терміналу є нативним додатком для Mac, можливо, є специфічні для Mac тонкощі, про які я не знаю.
Жил "ТАК - перестань бути злим"

ps -o tty= -p$$ і ps -o tty= -p$PPID , оскільки ви сказали, що вони повинні давати різний результат. Або я щось неправильно зрозумів?
phunehehe

@phunehehe: Вони дають різний вихід, якщо якщо батьківський процес оболонки є емулятором терміналу, оскільки емулятор термінала не має свого емуляційного терміналу як керуючого терміналу. Якщо ви виявите інше, будь ласка, опублікуйте вихід ps -p $$ -p $PPID(знову ж таки, у мене немає досвіду роботи з OSX, тому, можливо, в OSX відбувається щось незвичне).
Жил "ТАК - перестань бути злим"

@Gilles: це дійсно було щось незвичне з OSX. Я тестував на Gentoo і все було правильно, як ви сказали. На OSX, ps -p $$ -p $PPIDдає (вибачте, я не знаю, як форматувати коментарі) PID TTY TIME CMD 209 ttys000 0: 00.01 вхід -pf phunehehe 210 ttys000 0: 00.12 -bash
phunehehe

1

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

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

І скористайтеся цим, щоб вивести кількість снарядів, які вам знадобиться вийти, перш ніж приїхати до «кореневої» оболонки


1

Ви можете використовувати змінну середовища SHLVL :

echo "$SHLVL"

1
Якщо ви використовуєте, sshнаприклад, для цього ж акаунта, це все ще буде1
Антон

0

Я знаходжу це

$ pstree -u | grep ${USER}

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

Іноді це буде нагадувати мені, що я залишив nohupроботу, чи подібне.

(Також я використовую alias grep='grep --color=auto'.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.