如何判断终端会话是否在屏幕上运行


9

在运行bash脚本时,我想知道它是否在内运行screen。这可能吗?

我想要这样做,以便.bashrc可以根据会话是否在屏幕内启动来设置命令提示符的颜色。

我的回答一经发现,便找到了此链接:如何知道我是否在屏幕上?

Answers:


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转到另一台计算机,将无法使用。从那里开始的shell不会$STY在其环境中使用,无论如何都没有用,因为它无法访问您机器上的Unix域套接字。

但是,可以通过转义序列查询终端以确定其类型:

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以开头的内容设置screenscreen可以实现不同的终端类型)。$TERM传递翻过rloginrshtelnetssh。它不能像上面那样保证运行,但是更简单,并且不那么麻烦。

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

与先前的解决方案一样,您可能正在中运行screen,但是例如可能无法向其发出命令screen -X。但是请注意,您可以使用转义序列传递命令(尽管出于安全原因默认未启用该命令)。


4

在屏幕上运行时,$TERM环境变量将变为屏幕。您可以签入脚本,例如

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

那将是方法之一。echo $TERM在屏幕外,再echo $TERM在屏幕内,看看区别


我的$ TERM设置为“ xterm”。因此,这对我来说不起作用。
aakoch

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.