Вопрос: Как я узнаю, что я бегу внутри экрана «linux» или нет?


«Экран» относится к программе, упомянутой в Как подключиться к отключенной сессии ssh , Это хороший объект.

Но есть вопрос, который я действительно хотел бы узнать. Как узнать, запущен ли я на «экране»? Разница заключается в следующем:

  • Если да, я знаю, что могу безопасно закрыть текущее окно терминала, например, закрыть окно PuTTY, не потеряв сеанс оболочки (Bash и т. Д.).
  • Если нет, я знаю, что я должен позаботиться о любых ожидающих работах, прежде чем закрыть окно терминала.

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


57
2018-04-06 01:17


Источник


Если вы используете tmux вместо экрана, по умолчанию вы получаете небольшую строку состояния. Они практически одинаковы для базового использования. - Samuel Edwin Ward
Поместите свой тотем на стол и дайте ему вращаться. Если он держится, вы в порядке. Еще вы на экране:] - Konerak
Вы также можете использовать бёбу с экраном и tmux. Он может быть настроен на автоматическую загрузку при входе в систему, а затем нажатие клавиши F6 отключается и выходит из системы. - mp3foley
Возможный дубликат Как проверить, включен ли я в сеанс сеанса? - Andrew Schulman


Ответы:


(Украден у "Как я могу узнать, нахожусь ли я на экране?"над StackOverflow и автором пользователем Jho, Постскриптум Вы не можете голосовать за дубликат на сайтах StackExchange.)

Проверьте $STY, Если это нулевое значение, вы находитесь на «реальном» терминале. Если он содержит что-либо, это имя экрана, в котором вы находитесь.

Если вы не находитесь на экране:

eric@dev ~ $ echo $STY
eric@dev ~ $ 

Если вы находитесь на экране:

eric@dev ~ $ echo $STY
2026.pts-0.ip-10-0-1-71

Если вы используете tmux вместо экрана, проверьте также $TMUX, Чтобы добавить это в свой запрос, добавьте следующее ~/.bashrc:

if [ -n "$STY" ]; then export PS1="(screen) $PS1"; fi
if [ -n "$TMUX" ]; then export PS1="(tmux) $PS1"; fi

86
2018-04-06 01:24



если вы запускаете что-то через sudo он по умолчанию не будет наследовать переменные среды, включая $STY, Но $TERM  является обычно распространяются в среду sudo, поэтому, возможно, проверьте либо $STY  или  $TERM=="screen" - rcoup


Искать $STY который содержит screen использует для общения с самим собой; $WINDOW тогда будет текущий screen номер окна.


14
2018-04-06 05:28





Простая проверка, которую я обычно использую, - это просто нажать Ctrl-:

  • Если курсор переходит к началу строки, Я не внутри сеанс экрана.

  • Если Ничего не произошло, Я знаю это Я внутри сеанс экрана и что я только что использовал экран управления экраном. Я тогда ударил  (переход к началу строки), вес (показать текущие экранные окна) или выполнить некоторую другую «безобидную» экранную команду, чтобы вернуться в командную строку.

(Конечно, это работает только в том случае, если вы в настоящее время выполняете bash или какой-либо другой программный продукт, который «перескакивает в начало строки» или делает что-то эквивалентно безвредным при нажатии Ctrl-a.)


12
2018-04-06 01:21



Это работает, только если ваш экранный ключ управления остается по умолчанию Ctrl-a, конечно. - ShreevatsaR
нажатие клавиши управления + DD будет отсоединять и завершать ssh. Вы можете поразить эту комбинацию для большего удобства - akostadinov
Хотя ответ отвечает за реальный вопрос, этот метод не доступен для сценариев. - Nikodemus RIP


Что ж, большинство времени (отсутствие чьи-то попытки ввернуть с вещами) ваши TERM будет установлено значение screen (или, по крайней мере, упоминания screen где-то).

Легкое решение проблемы - это просто запустить экран везде. Говорю, не покидайте его дома.


7
2018-04-06 17:01



$TERM также обычно распространяется через sudo, что является плюсом! - rcoup


Я держу это в своем .bashrc:

 PS1='[\u@\h \W'
 if [ "$WINDOW" ]; then PS1="$PS1 ($WINDOW)"; fi
 PS1="$PS1]$"

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


7
2017-09-16 00:56





У меня еще более холодный путь.

Добавьте к вашему ~ / .screenrc следующее: вы увидите строку состояния внизу (показывая в инвертированном тексте дату, время и загрузку системы).

    hardstatus alwayslastline
    hardstatus string '%Y-%m-%d %c | %l'

Отправьте это, когда в сеансе экрана с ctrl-a:source ~/.screenrc,

Для этого я должен поблагодарить Кайла Ранкина из Linux Journal. Посмотрите его фантастическую статью на http://www.linuxjournal.com/article/10950, Раздел справочной страницы, на который он ссылается, можно найти по адресу http://www.gnu.org/software/screen/manual/screen.html#String-Escapes,


3
2018-04-06 14:19





вы также можете отредактировать дерево процессов из $$ чтобы узнать, найден ли экземпляр экрана. точная цепочка, вероятно, будет зависеть от вашей настройки - в моем ящике OS X, zsh внутри экрана login как его родитель, SCREEN как его дедушка и бабушка, и screen как его прадедушка.


2
2017-11-14 05:16





Вы можете использовать это. Он короткий и сладкий.

function trim() {
    echo "${1// /}"
}

VAR="    xxx    "
echo $VAR
TRIMMED_VAR=$(trim "$VAR")
echo $TRIMMED_VAR

-2



Как это здесь даже актуально? - Michael Hampton♦