我怎么知道我是否在屏幕上?

在linux中使用屏幕时,如何判断我是否在屏幕上? 我可以exit ,如果我在一个屏幕,我会退出一个屏幕,但如果我不在,那么我最终会closures我的terminal。

在进行screen -r ,我可以看到是否还有其他屏幕,但是如何知道当前的terminal是否是其中一个屏幕?

检查$STY 。 如果它是空的,你是在一个“真正的”terminal。 如果它包含任何东西,那就是你所在的屏幕的名字。

如果你不在屏幕上:

 eric@dev ~ $ echo $STY eric@dev ~ $ 

如果你在屏幕上:

 eric@dev ~ $ echo $STY 2026.pts-0.ip-10-0-1-71 

我做的另一个方法是echo $ TERM。 由于我最终做了很多,我在我的.bashrc文件中添加了一个别名:

 alias trm='echo $TERM' 

这样,无论是否在屏幕上,如果我只是执行“trm”,它将显示我是否在SCREEN或其他地方(通常是XTERM)。

只需inputecho $STY ; 这将返回附加的屏幕与进程ID例如

 $ echo $STY 34046.myScreen 

另一种方法来检查你是否在屏幕上。

types:

 Ctrl-a ? 

如果你看到屏幕帮助你在屏幕上。

否则,你会得到一个问号“?” 在提示符上。

由于所有其他的方法都依赖于环境variables(可以简单地被覆盖)或者屏幕的命令字符(也可以被覆盖),所以最简单的检查方法是列出当前进程的所有祖先。

 pstree --show-parents -p $$ | head -n 1 | sed 's/\(.*\)+.*/\1/' | grep screen | wc -l 

如果它打印1,那么当前正在运行的进程的可执行文件的名称中有一个“屏幕”字样的祖先,否则就没有。

可以从以下方面获得更加容易的可见检查:

 pstree --show-parents -p $$ | head -n 1 | sed 's/\(.*\)+.*/\1/' | less 

虽然ssh进入了一个远程(旧)系统,但我注意到$ TERM表示我正在使用'screen-256color',但是没有termcap / terminfo条目,所以我不得不在.bashrc中使用下面的命令防止terminal产生偶尔的垃圾:

 case $TERM in (screen-256color) export TERM='screen' esac 

让它使用简单的入口。

TL; DR,$ TERM 通常会指示您是否在远程ssh的屏幕会话中。 你可以case $TERM in (screen*) echo "you are in a screen session"; esac使用case $TERM in (screen*) echo "you are in a screen session"; esac case $TERM in (screen*) echo "you are in a screen session"; esac如果你只是想要一个视觉线索,不需要做一些具体的事情

将以下一项或多项添加到.bashrc

  • alias mysession='echo ${STY}'
  • alias myterm='echo ${TERM}'
  • alias isscreen='if test -n "$STY"; then echo " screen session: ${STY}"; else echo " NOT a screen session"; fi'

然后你可以通过input简单的命令知道你是否在screen

大多数上述答案的问题是,我们可能在一个附加的屏幕会话的子shell 。 或者我们可能会从屏幕会话中向远程主机打开一个shell。 在前一种情况下,我们可以走过程树目录并匹配screen程序名称。 在后一种情况下,大多数情况下,我们可以检查TERMvariables,如screen*

我的答案类似于/ u / Parthian-Shot,但不依赖于pstree实用程序; 他使用的选项不适用于我。 另一方面,我的实现仍然依赖于Linux:对于非Linux系统,必须调整ps命令; 对于不支持数组的旧版本的系统,您将有更多的解决方法。 但不pipe怎么说:

 ps_walk_parents() { local tmp local ppid=$PPID while [[ $ppid != 1 ]]; do tmp=($( ps -o ppid,comm -p $ppid )) ppid=${tmp[0]} # grab parent pid echo ${tmp[1]} # output corresponding command name done } if [[ "$TERM" =~ screen* ]] || ps_walk_parents |grep -qxi screen ; then # we are in a screen terminal fi 

我们可以优化我们的function,以停止search/当一个进程的父母匹配目标命令名称(“屏幕”),但一般来说,该function将只能进行2到3次迭代。 大概你想把这个代码放在一些启动初始化如.bashrc或.profile什么的,所以再次,不值得优化。

我对这个问题的解决方法要简单得多:只要打开TAB ,如果你 GNU屏幕 内部,就可以使整个terminal闪烁 (快速的video反转)。

在大多数Linux (Ubuntu,Kali,Debian,RaspBerry等)和FreeBSD ,GUI以及任何本地或远程terminal(包括Ctrl Alt Fn)上进行testing。

作为这种方法的一个例外 ,请注意这个(相当复杂但可能)的情况:

  • 1.-进入计算机A(让我们假设Linux)。
  • 2.-从计算机A的远程terminalinput一个新的screen -S AScr
  • AScr从GNU Screen AScrterminal到电脑B的SSH
  • 4.-从计算机B的远程terminalinput新的screen -S BScr

您在情况2和情况4中处于Screen ,情况1和3处于Screen外部,但情况2,3和4时,terminal将闪烁。

screen -ls可以告诉你。

外屏:

 $ screen -ls There are screens on: 16954.pts-1.auds916 (Detached) 242.pts-8.auds916 (Detached) 2 Sockets in /tmp/screens/S-glennj. 

在屏幕内:

 $ screen -ls There are screens on: 16954.pts-1.auds916 (Attached) 242.pts-8.auds916 (Detached) 2 Sockets in /tmp/screens/S-glennj.