在linux中使用屏幕时,如何判断我是否在屏幕上?我可以做exit
,如果我在一个屏幕上,我将退出一个屏幕,但如果我不在,那么我最终会关闭我的终端。
在做screen -r
时,我可以看到我是否附加了其他屏幕,但我如何知道我当前的终端是否是其中一个附加屏幕?
检查$STY
。如果它为空,那么你就是一个“真正的”终端。如果它包含任何内容,那么它就是您所在屏幕的名称。
如果你不在屏幕上:
eric@dev ~ $ echo $STY
eric@dev ~ $
如果你在屏幕上:
eric@dev ~ $ echo $STY
2026.pts-0.ip-10-0-1-71
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.
我做的另一种方法是回应$ TERM。由于我最终做了很多,我在.bashrc文件中添加了一个别名:
alias trm='echo $TERM'
这样,无论是否在屏幕上,如果我只是执行'trm',它会告诉我我是在SCREEN还是其他地方(通常是XTERM)。
检查您是否在屏幕中的替代方法。
类型:
Ctrl-a ?
如果你看到屏幕帮助你在屏幕上。
否则你会得到一个问号'?'在提示上。
只需输入echo $STY
;这将返回带有进程ID的附加屏幕,例如
$ echo $STY
34046.myScreen
由于这里的所有其他方法都依赖于环境变量(可以简单地被覆盖)或屏幕的命令字符(也可以被覆盖),最简单的检查方法是列出当前进程的所有祖先。
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
虽然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
将以下一项或多项添加到.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
里面。
大多数上述答案的问题在于我们可能处于附加屏幕会话的子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或者其他东西,所以再次,不值得优化。
我对这个问题的解决方案要简单得多:如果你在GNU Screen中,只要点击TAB就可以使整个终端闪烁(快速视频反转)。
测试了大多数Linux(Ubuntu,Kali,Debian,RaspBerry等)和FreeBSD,GUI和任何终端,本地或远程,包括CtrlAltFn。
作为此方法的一个例外,请注意这个(相当复杂但可能)的情况:
screen -S AScr
。AScr
终端进入计算机B.screen -S BScr
。你在案例2和4的Screen
里面,在案例1和3的Screen
之外,但终端将在案例2,3和4上闪烁。