Как я могу узнать, нахожусь ли я на экране?

При использовании экрана в Linux, как я могу узнать, есть ли я на экране или нет? Я мог бы сделать exit, и я выйду из экрана, если бы был в одном, но если бы я не был, тогда я закончу закрытие терминала.

При выполнении screen -r я мог видеть, есть ли у меня другие экраны, но как узнать, является ли мой текущий терминал одним из этих подключенных экранов?

Ответ 1

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

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

[email protected] ~ $ echo $STY
[email protected] ~ $ 

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

[email protected] ~ $ echo $STY
2026.pts-0.ip-10-0-1-71

Ответ 2

Еще один способ, которым я это сделал, - повторить $ TERM.

 $ echo $TERM
 screen

Так как я очень часто этим занимаюсь, я добавил псевдоним в мой файл .bashrc:

alias trm='echo $TERM'

Таким образом, на экране или нет, если я просто выполню "trm", он покажет мне, на экране я или в другом месте (обычно XTERM).

Ответ 3

Альтернативный подход для проверки, находитесь ли вы на экране.

Тип:

Ctrl-a ?

Если вы видите экранную справку на экране.

В противном случае вы получите знак вопроса '?' в командной строке.

Ответ 4

Просто введите echo $STY; это вернет прикрепленный экран с идентификатором процесса например

$ echo $STY 
  34046.myScreen

Ответ 5

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

pstree --show-parents -p $$ | head -n 1 | sed 's/\(.*\)+.*/\1/' | grep screen | wc -l

Если он печатает 1, тогда текущий процесс, который вы используете, имеет предка со словом "экран" в исполняемом имени, иначе не было.

Более легкий видимый осмотр может быть получен из:

pstree --show-parents -p $$ | head -n 1 | sed 's/\(.*\)+.*/\1/' | less

Ответ 6

В то время как ssh'd в удаленную (более старую) систему я заметил, что $TERM указал, что я использовал 'screen-256color', однако для этого не было записи termcap/terminfo, поэтому я был вынужден прибегнуть к следующему:.bashrc, чтобы предотвратить возникновение случайного мусора терминалом:

case $TERM in 
    (screen-256color) export TERM='screen'
esac

чтобы вместо этого использовать обычную запись.

TL; DR, $TERM обычно укажет, находитесь ли вы на сеансе экрана, когда ssh'd удаленно. Вы можете использовать case $TERM in (screen*) echo "you are in a screen session"; esac, если вы просто хотите визуальный ключ и не нужно делать что-то конкретное

Ответ 7

Добавьте одно или несколько из следующих элементов в .bashrc

  • alias mysession='echo ${STY}'
  • alias myterm='echo ${TERM}'
  • alias isscreen='if test -n "$STY"; then echo " screen session: ${STY}"; else echo " NOT a screen session"; fi'

Затем вы можете узнать, находитесь ли вы внутри screen, набрав простые команды.

Ответ 8

Проблема с большинством вышеприведенных ответов заключается в том, что мы можем быть в подоболочке подключенного сеанса экрана. Или мы можем открыть оболочку на удаленном хосте из сеанса экрана. В первом случае мы можем отслеживать происхождение дерева процессов и соответствовать имени программы screen. В последнем случае большую часть времени мы можем проверить переменную TERM для чего-то вроде screen*.

Мой ответ os похож на /u/Parthian -Shot, но не так сильно зависит от утилиты pstree; варианты, которые он использует, мне недоступны. С другой стороны, моя реализация по-прежнему зависит от Linux: для систем, отличных от Linux, нужно настроить команду ps; для систем со старыми оболочками, которые не поддерживают массивы, у вас будет еще больше возможностей для работы. Но в любом случае:

ps_walk_parents() {
  local tmp
  local ppid=$PPID
  while [[ $ppid != 1 ]]; do
    tmp=($( ps -o ppid,comm -p $ppid ))
    ppid=${tmp[0]}  # grab parent pid
    echo ${tmp[1]}  # output corresponding command name
  done
}
if [[ "$TERM" =~ screen* ]] || ps_walk_parents |grep -qxi screen ; then
  # we are in a screen terminal 
fi

Мы могли бы немного оптимизировать нашу функцию, чтобы прекратить поиск, если/когда родитель процесса соответствует имени целевой команды ( "экран" ), но в целом функция будет выполнять только от 2 до 3 итераций. Предположительно, вы хотите поместить этот код в некоторую инициализацию запуска, такую ​​как .bashrc или .profile или что-то еще, поэтому не стоит оптимизировать.

Ответ 9

Мое решение проблемы намного проще: просто нажатие TAB делает полный терминал мигает (быстрая инверсия видео), если вы внутри Экран GNU.

Протестировано, работая над большинством Linux (Ubuntu, Kali, Debian, RaspBerry... и т.д.) и FreeBSD, графическим интерфейсом и любым терминалом, локальным или удаленным, включая Ctrl Alt Fn.

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

  • 1.- SSH в компьютер A (позволяет предположить Linux).
  • 2.- Введите новый screen -S AScr с удаленного терминала на компьютере A.
  • 3.- SSH с экрана GNU Screen AScr в компьютер B.
  • 4.- Введите новый screen -S BScr с удаленного терминала на компьютере B.

Вы находитесь внутри Screen в случаях 2 и 4 и вне a Screen в случаях 1 и 3, но терминал будет мигать на случаях 2, 3 и 4.

Ответ 10

screen -ls может сказать вам.

Внешний экран:

$ screen -ls
There are screens on:
        16954.pts-1.auds916     (Detached)
        242.pts-8.auds916       (Detached)
2 Sockets in /tmp/screens/S-glennj.

Внутри экрана:

$ screen -ls
There are screens on:
        16954.pts-1.auds916     (Attached)
        242.pts-8.auds916       (Detached)
2 Sockets in /tmp/screens/S-glennj.