在运行bash脚本时,我想知道它是否在内运行screen
。这可能吗?
我想要这样做,以便.bashrc
可以根据会话是否在屏幕内启动来设置命令提示符的颜色。
我的回答一经发现,便找到了此链接:如何知道我是否在屏幕上?
在运行bash脚本时,我想知道它是否在内运行screen
。这可能吗?
我想要这样做,以便.bashrc
可以根据会话是否在屏幕内启动来设置命令提示符的颜色。
我的回答一经发现,便找到了此链接:如何知道我是否在屏幕上?
Answers:
通常,$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
以开头的内容设置screen
(screen
可以实现不同的终端类型)。$TERM
传递翻过rlogin
,rsh
,telnet
,ssh
。它不能像上面那样保证运行,但是更简单,并且不那么麻烦。
case $TERM in
(screen*) echo "I'm more than likely running in screen"
esac
与先前的解决方案一样,您可能正在中运行screen
,但是例如可能无法向其发出命令screen -X
。但是请注意,您可以使用转义序列传递命令(尽管出于安全原因默认未启用该命令)。
在屏幕上运行时,$TERM
环境变量将变为屏幕。您可以签入脚本,例如
if [[ "$TERM" == screen* ]]; then
echo "Running in screen"
else
echo "Outside screen"
fi
那将是方法之一。echo $TERM
在屏幕外,再echo $TERM
在屏幕内,看看区别