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

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

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

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

我的答案得到答复后发现了此链接:如何判断我是否在屏幕中?

答案1

通常,$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穿过rlogin, rsh, telnet,传递ssh。它不能保证像上面那样工作,但更简单并且侵入性更小。

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

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

答案2

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

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

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

答案3

我自己使用 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

相关内容