如何判断当前终端会话是否在GNU Screen中?

15

当当前终端窗口由GNU Screen管理时,我想在.bashrc中执行一个命令。我该怎么做?有没有相关的环境变量?我曾经使用过:

if [ -n "$WINDOW" ]; then
    command
fi

但是据我所知,$WINDOW可能在所有由 Screen 管理的会话中定义或未定义。


可能是如何判断自己是否在screen中?的重复问题。 - Maic López Sáenz
5个回答

19

检查环境变量 $STY(包含有关屏幕的信息)或 $TERM 是否为'screen'(可能不太可靠)。


我一直在使用依赖于$TERM的模仿脚本,感谢您提供的信息!更糟糕的是,有些脚本运行的机器上安装的bash版本太老,条件语句受到限制(例如没有部分匹配)。 - Jan
$STY 方法在 sudo 脚本中运行 screen 时无法工作。 - ceztko

5

4

请检查$TERM,在屏幕会话中它被设置为'screen'(但不保证100%准确)。

更新

或者,您可以利用在屏幕中,$TERMCAP包含屏幕子字符串的事实:

[[ $TERMCAP =~ screen ]] && echo "in screen"

也不是百分之百保证。

更新2

如果上述方法都无效,您可以在screen手册中找到灵感。


屏幕似乎从启动它的终端会话中继承$TERM值。因此,在我的情况下,它是xterm-256color,并且取决于环境。我想要的是通用解决方案,可以在所有环境下工作。 - OTZ
$TERMCAP方法适用于更多的情况,但会错过在同一个屏幕窗口下SSH到其他主机的情况,此时$TERMCAP不会包含'screen'子字符串。因此,它的适用性与$WINDOW完全相同,一旦你ssh到其他主机,它也会失去其值。但是所有条件相等的情况下,$WINDOW谓词的工作速度更快。 - OTZ
没错,我所说的“适用性完全相同”就是这个意思。我一直在查看GNU screen的源代码,看起来似乎没有解决方案。可以编写一个函数来执行ssh,然后设置一个特殊的环境变量,但这并不是很优雅。 - OTZ

2
我想提出一种替代方案,它始终可见且不需要检查即可知道您是否在 screen 会话中。只需在您的 $HOME 文件夹中添加/编辑一个名为 ~/.screenrc 的文件,并添加 caption 命令即可。
caption always "%{= kc}Screen session on %H (system load: %l)%-28=%{= .m} %Y-%m-%d %0c"

"你将会在底部看到一行始终可见且有颜色的文字。"
Screen session on host (system load: 1.50 1.40 1.30)        2017-04-23 14:06

请注意:
当您在主机1上使用screen并打开另一个SSH会话到主机2并在那里打开也有.screenrc的screen时,底部会有两行叠在一起(像一个包装器)。
在这种情况下非常有用!
主机2上的Screen会话(系统负载:0.01 0.03 0.05)2017-04-23 14:14 主机1上的Screen会话(系统负载:0.00 0.00 0.00)2017-04-23 14:14
附加信息:

https://www.gnu.org/software/screen/manual/html_node/Caption.html

命令:caption always|splitonly [字符串]

https://www.gnu.org/software/screen/manual/html_node/String-Escapes.html#String-Escapes


我在Stack Overflow上找到了这个链接here

1

检查变量$TERM


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接