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
,例如。但是请注意,您可以使用转义序列传递命令(尽管出于安全原因默认情况下未启用它)。
在屏幕中运行时,您的$TERM
环境变量将更改为屏幕。您可以检查脚本,例如
if [[ "$TERM" == screen* ]]; then
echo "Running in screen"
else
echo "Outside screen"
fi
Run Code Online (Sandbox Code Playgroud)
这将是其中一种方法。echo $TERM
在屏幕外和echo $TERM
屏幕内再次观察差异