我怎么知道我是否在屏幕上?
在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
程序名称。 在后一种情况下,大多数情况下,我们可以检查TERM
variables,如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 ScreenAScr
terminal到电脑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.