运行 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
以 开头的内容screen
(screen
可以实现终端的不同变体)。$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