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

时间:2011-03-22 14:13:38

标签: linux shell gnu-screen

在linux中使用屏幕时,如何辨别我是否在屏幕上? 我可以做exit,如果我在一个屏幕上,我将退出一个屏幕,但如果我不在,那么我最终会关闭我的终端。

在做screen -r时,我可以看到我是否附加了其他屏幕,但我怎么知道我当前的终端是否是其中一个附加屏幕?

10 个答案:

答案 0 :(得分:108)

检查$STY。如果它为空,那么你就是一个“真正的”终端。如果它包含任何内容,则它是您所在屏幕的名称。

如果你不在屏幕上:

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

如果你在屏幕上:

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

答案 1 :(得分:14)

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

alias trm='echo $TERM'

这样,无论是否在屏幕上,如果我只是执行'trm',它会告诉我我是否在SCREEN或其他地方(通常是XTERM)。

答案 2 :(得分:10)

检查您是否在屏幕中的替代方法。

型:

Ctrl-a ?

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

否则你会得到一个问号'?'在提示上。

答案 3 :(得分:7)

输入echo $STY;这将返回带有进程ID的附加屏幕 e.g

$ echo $STY 
  34046.myScreen

答案 4 :(得分:2)

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

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

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

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

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

答案 5 :(得分:1)

当ssh进入一个远程(旧)系统时,我注意到$ TERM表示我使用的是'screen-256color',但是没有termcap / terminfo条目,所以我不得不求助于以下.bashrc以防止终端偶尔产生垃圾:

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

答案 6 :(得分:1)

将以下一项或多项内容添加到.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'

然后,您可以通过键入简单命令来了解您是否在screen内。

答案 7 :(得分:0)

上述大部分答案的问题在于我们可能位于附加屏幕会话的子shell 中。或者我们可能会在屏幕会话中向远程主机打开shell。在前一种情况下,我们可以遍历进程树parentage并匹配screen程序名称。在后一种情况下,大多数情况下,我们可以检查TERM变量,例如screen*

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

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

我们可以稍微优化我们的函数来停止搜索进程父进程是否匹配目标命令名称(“screen”),但一般情况下,该函数只会进行2到3次迭代。大概你想把这些代码放在一些启动初始化中,比如.bashrc或.profile或者其他东西,所以再次,不值得优化。

答案 8 :(得分:0)

我对这个问题的解决方案要简单得多:只需点击 TAB 即可完成终端闪烁(快速视频反转)是内部 GNU屏幕

测试了大多数 Linux (Ubuntu,Kali,Debian,RaspBerry等)和 FreeBSD ,GUI和任何终端,本地或远程,包括 Ctrl Alt Fn

作为此方法的异常,请注意这个(相当复杂但可能)的案例场景:

  • 1.- SSH进入计算机A(假设Linux)。
  • 2.-从计算机A上的远程终端输入新的screen -S AScr
  • 3.-从GNU Screen AScr终端进入计算机B的SSH。
  • 4.-从计算机B上的远程终端输入新的screen -S BScr

案例2和案例4中的Screen以及案例1和案例3中的Screen以外,但案例2,3和4的终端将闪烁。

答案 9 :(得分:-3)

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.