Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 我如何判断我是否';我在屏幕上?_Linux_Shell_Gnu Screen - Fatal编程技术网

Linux 我如何判断我是否';我在屏幕上?

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

在linux中使用screen时,如何判断我是否在屏幕中? 我可以做
退出
,如果我在一个屏幕中,我将退出一个屏幕,但如果我没有,那么我将关闭我的终端


当执行
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”)。虽然我猜如果你不在屏幕上,它可能会将光标移动到当前行的开头