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

Dus*_*yte 10 bash gnu-screen bashrc

运行 bash 脚本时,我希望能够判断它是否在screen. 这可能吗?

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

回答我的问题后发现了此链接:如何判断我是否在屏幕中?

Sté*_*las 11

通常,$STY将被设置。

所以:

if [ -n "$STY" ]; then
  echo "I'm most likely running under screen"
fi
Run Code Online (Sandbox Code Playgroud)

$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
Run Code Online (Sandbox Code Playgroud)

@val0x00ff 建议的另一种方法是检查$TERM环境变量的值。该值旨在告诉应用程序他们正在与哪种类型的终端交谈。它被设置为screen以开头的东西screen(因为screen可以实现不同的终端变体)。$TERM通过rlogin, rsh, telnet, ssh。它不能像上面那样保证工作,但更简单,侵入性更小。

case $TERM in
  (screen*) echo "I'm more than likely running in screen"
esac
Run Code Online (Sandbox Code Playgroud)

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


Val*_*ami 5

在屏幕中运行时,您的$TERM环境变量将更改为屏幕。您可以检查脚本,例如

if [[ "$TERM" == screen* ]]; then
  echo "Running in screen"
else 
  echo "Outside screen"
fi 
Run Code Online (Sandbox Code Playgroud)

这将是其中一种方法。echo $TERM在屏幕外和echo $TERM屏幕内再次观察差异