Linux 我如何判断我是否';我在屏幕上?
在linux中使用screen时,如何判断我是否在屏幕中? 我可以做Linux 我如何判断我是否';我在屏幕上?,linux,shell,gnu-screen,Linux,Shell,Gnu Screen,在linux中使用screen时,如何判断我是否在屏幕中? 我可以做退出,如果我在一个屏幕中,我将退出一个屏幕,但如果我没有,那么我将关闭我的终端 当执行screen-r时,我可以看到是否连接了其他屏幕,但如何知道我的当前终端是否是这些连接的屏幕之一?检查$STY。如果为空,则表示您在“真实”终端上。如果它包含任何内容,则是您所在屏幕的名称 如果您不在屏幕中: eric@dev ~ $ echo $STY eric@dev ~ $ eric@dev ~ $ echo $STY 2026.pt
退出
,如果我在一个屏幕中,我将退出一个屏幕,但如果我没有,那么我将关闭我的终端
当执行
screen-r
时,我可以看到是否连接了其他屏幕,但如何知道我的当前终端是否是这些连接的屏幕之一?检查$STY
。如果为空,则表示您在“真实”终端上。如果它包含任何内容,则是您所在屏幕的名称
如果您不在屏幕中:
eric@dev ~ $ echo $STY
eric@dev ~ $
eric@dev ~ $ echo $STY
2026.pts-0.ip-10-0-1-71
如果您在屏幕中:
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
$ echo $TERM
screen
由于我经常这样做,我在.bashrc文件中添加了一个别名:
alias trm='echo $TERM'
这样,无论是否在屏幕上,如果我只执行“trm”,它将显示我是在屏幕上还是在其他地方(通常是XTERM)。检查您是否在屏幕上的替代方法 类型: 如果您看到屏幕帮助,您将进入屏幕
否则,您将在提示符上得到一个问号“?”。因为这里的所有其他方法都依赖于环境变量(可以简单地重写)或屏幕的命令字符(也可以重写),所以最简单的检查方法是列出当前进程的所有祖先
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/TermFo条目,因此我不得不在.bashrc中使用以下命令来防止终端偶尔产生垃圾:
case $TERM in
(screen-256color) export TERM='screen'
esac
要让它运行,请改为使用普通条目
TL;DR,$TERM通常表示ssh远程启动时您是否处于屏幕会话中。您可以在(screen*)echo“您正在屏幕会话”中使用
case$TERM;esac
如果您只需要一个视觉线索,而不需要做特定的事情请将以下一项或多项添加到您的.bashrc
别名mysession='echo${STY}'
别名myterm='echo${TERM}'
别名isscreen='if test-n“$STY”;然后回显“屏幕会话:${STY}”;else回显“非屏幕会话”;fi'
然后,通过键入简单的命令,您可以知道自己是否在
屏幕中。上述大多数答案的问题是,我们可能在附加屏幕会话的子shell中。或者,我们可能正在屏幕会话中向远程主机打开一个shell。在前一种情况下,我们可以遍历进程树的父级并匹配屏幕
程序名。在后一种情况下,大多数情况下,我们可以检查术语
变量中的屏幕*
之类的内容
我的回答类似于/u/pathian 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屏幕内,整个终端就会闪烁(快速视频反转)
在大多数Linux(Ubuntu、Kali、Debian、RaspBerry…等)和FreeBSD、GUI和任何本地或远程终端(包括CtrlAltFn)上进行测试
作为此方法的一个例外,请注意以下情况(相当复杂,但可能):
- 1.-SSH到计算机A(假设是Linux)
- 2.-从计算机a上的远程终端输入新的
屏幕-S AScr
- 3.-SSH从GNU屏幕
AScr
终端进入计算机B
- 4.-从计算机B上的远程终端输入新的
屏幕-S BScr
在案例2和案例4中,您在屏幕
内,在案例1和案例3中,您在屏幕
外,但在案例2、3和案例4中,终端将闪烁。并非如此。仅仅因为有一个屏幕,并不意味着你就在里面。它也可以从另一个终端连接/打开。STY代表什么?@StevenYou我所发现的就是。这并不能真正解释变量名的选择。如果您在启动屏幕的同一台机器上,则此选项有效。如果您使用ssh连接到新机器,则需要传递变量。(即宋承宪)user@host“STY=$STY”)@StevenYou可能代表“屏幕打字机”或“插座式打字机”。代表“电传打字机”,代表“伪终端打字机”。他们可能认为这很明显,他们不需要明确地提到他们的推理。正如本次对话所证明的,他们错了。值得一提的是,这似乎不适用于osx上的tmux,而基于“$TERM”的检查适用。当然,这假设Ctrl
+a
是屏幕的命令字符。虽然这对大多数人来说都是正确的,但值得指出的是,命令字符可以被-e
标志覆盖,因此这并不总是有效的。这非常有效(例如Ctrl+a然后“escape”)。虽然我猜如果你不在屏幕上,它可能会将光标移动到当前行的开头