Как узнать, запущена ли терминальная сессия на экране

9

Когда я запускаю скрипт bash, я бы хотел сказать, работает ли он внутри screen. Это возможно?

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

Обнаружил эту ссылку, как только на мою ответили: как я могу узнать, нахожусь ли я на экране?

DustByte
источник

Ответы:

10

Как правило, $STYбудет установлено.

Так:

if [ -n "$STY" ]; then
  echo "I'm most likely running under screen"
fi

$STYкак правило, то, что вам нужно поговорить с вашим screen. Это используется для построения пути сокета домена Unix, используемого для управления screen(что-то вроде /var/run/screen/S-$USER/$STY.

Например, это не сработает, если с этого экрана вы перейдете sshна другую машину. Запущенная там оболочка не будет иметь $STYв своем окружении, и это в любом случае не принесет ей никакой пользы, поскольку она не сможет получить доступ к доменным сокетам Unix на вашей машине.

Однако можно запросить терминал с помощью escape-последовательности, чтобы определить его тип:

if [ -t 1 ] && [ -t 0 ]; then
  s=$(stty -g)
  stty -icanon -echo min 0 time 3
  printf '\033[>c'
  type=$(dd count=1 2> /dev/null)
  stty "$s"
  case $type in
    (*'>83;'*) echo "this is screen"
  esac
fi

Другой подход, предложенный @ val0x00ff, заключается в проверке значения $TERMпеременной среды. Это значение предназначено для того, чтобы сообщать приложениям, с каким типом терминала они общаются. Он задается screenчем-то, что начинается с screen(как screenможно реализовать различные варианты терминалов). $TERMпередается accross rlogin, rsh, telnet, ssh. Это не так гарантированно, как описано выше, но проще и менее навязчиво.

case $TERM in
  (screen*) echo "I'm more than likely running in screen"
esac

Как и в предыдущем решении, вы можете работать screen, но, возможно, вы не сможете, например, выдавать ему команды screen -X. Однако обратите внимание, что вы можете передавать команды, используя escape-последовательности (хотя это не включено по умолчанию из соображений безопасности).

Стефан Шазелас
источник
4

При запуске на экране ваша $TERMпеременная среды меняется на экран. Вы можете проверить в сценарии, например,

if [[ "$TERM" == screen* ]]; then
  echo "Running in screen"
else 
  echo "Outside screen"
fi 

Это был бы один из подходов. echo $TERMза пределами экрана и снова echo $TERMвнутри экрана и увидеть разницу

Валентин Байрами
источник
Мой $ TERM установлен на "xterm". Так что это не сработает в моем случае.
Аакоч
1

Я использую tmux сам, и это немного, чтобы перечислить сессии, только если я еще не в сессии tmux

if [ -z "$TMUX" ]; then
    alias tmuxa='tmux attach -d -t'
    alias tmuxc='tmux new-session -s'
    echo "You're not in a tmux session, create a new one with tmuxc, or attach to one of the ones below with tmuxa"
    tmux ls
fi
Rqomey
источник