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

问题描述 投票:66回答:10

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

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

linux shell gnu-screen
10个回答
108
投票

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

如果你不在屏幕上:

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

如果你在屏幕上:

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

-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.

14
投票

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

alias trm='echo $TERM'

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


10
投票

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

类型:

Ctrl-a ?

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

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


7
投票

只需输入echo $STY;这将返回带有进程ID的附加屏幕,例如

$ echo $STY 
  34046.myScreen

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

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


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里面。


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或者其他东西,所以再次,不值得优化。


0
投票

我对这个问题的解决方案要简单得多:如果你在GNU Screen中,只要点击TAB就可以使整个终端闪烁(快速视频反转)。

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

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

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

你在案例2和4的Screen里面,在案例1和3的Screen之外,但终端将在案例2,3和4上闪烁。

© www.soinside.com 2019 - 2024. All rights reserved.