如何知道我所处的炮弹的“高度”?


32

如果我打开一个终端,xterm我将拥有一个外壳。然后,如果我使用sshzsh我将有另一个“级别”的外壳程序。有没有办法知道我必须退出Ctrl+D或键入多少次exit才能退出所有这些?我的真正意图是退出除“ root”外壳程序之外的所有内容。

知道终端多路复用器(如screen)对解决方案有什么影响也将是一件很高兴的事情。

PS:请随时更改标题,我不知道这些术语是否正确。

Answers:


6

一种(公认不完美)的方法是将的结果添加ps --no-headers -o comm $PPID到您的shell提示符中。这将告诉您产生外壳程序的进程的名称。如果您在嵌套的zsh中,它将显示“ zsh”。如果您在顶级zsh中,它将显示为“ xterm”或“ screen”或您的shell正在运行的任何内容。

要确定您是在ssh会话中还是在su会话中,只需查看提示中的主机名和用户名部分即可。

当您运行嵌套屏幕时(我不认为这是常见的情况),我无法想到告诉您是处于嵌套屏幕的顶级外壳还是顶级外壳中顶级屏幕的 您可以将屏幕配置为始终显示状态行,如果您位于嵌套屏幕中,则会导致显示多个状态行。


Aaah ...快点..击败我。:) +1
斯特凡(Stefan)2010年

目前,我在Mac上,命令给了我ps: illegal option -- -,知道为什么吗?我很快将在Linux中再次对其进行测试:)
phunehehe 2010年

3
@phunehehe:--option-name主要是特定于GNU的功能,因此在Linux之外的标准系统实用程序中几乎不可用。但是您可以ps --no-headers通过=在列名称后面添加来获得可移植的效果。同样,该comm列不是POSIX,但是该cmd列(包括命令的参数)是。-pPOSIX语法中的PID之前也有必要。因此ps -o cmd= -p $PPID是便携式的,并提供类似的信息。
吉尔(Gilles)“所以,别再邪恶了”,2010年

确认,在Gentoo
phunehehe

2
@phunehehe:对不起,我在上面的评论中犯了一个错误。实际上,该comm列是由POSIX指定的,并记录在Mac OS X上,而该cmd列存在于Linux上,但不是标准列。
吉尔斯(Gilles)'所以

37

实际上,您碰到了正确的词¹。有一个环境变量SHLVL,所有主要的交互式shell(bash,tcsh,zsh)在启动时都会增加1。因此,如果您在壳内启动壳,请SHLVL增加1。

但是,这并不能直接解决您的问题,因为会SHLVL继承终端仿真器之类的东西。例如,在我的典型配置中,$SHLVLxterm中的值为2,因为级别1对应于运行我的X会话(~/.xinitrc~/.xsession)的外壳。

我要做的是$SHLVL在提示符下显示,但仅在shell的父进程是另一个shell时(具有启发式的提示,例如“如果其名称结尾sh加上可选的标点符号和数字,则是shell”)。这样,在不常见的情况下,一个外壳在另一个外壳下运行,我有明显的视觉指示。

也许您希望检测直接在终端仿真器下运行的shell。你可以相当准确地做到这一点:这些都是它的父进程有不同的控制终端的炮弹,使ps -o tty= -p$$ps -o tty= -p$PPID产生不同的输出。您可以SHLVL在这些shell中手动将其重置为1,或者在这些shell中将您自己的重置为1 TERMSHLVL(否则增加)。

¹ 虽然不会在手册页上看到它:支持它的三个shell都没有在其文档中包含“ level”一词SHLVL


感谢您确认条款。我仍然在Mac上,惊讶地发现无论我的shell级别如何,这2条命令给出的结果相同。
phunehehe

@phunehehe:什么2条命令?如果您的意思是ps -o tty= -p$pid,这将显示进程的控制终端,它标识了该进程正在运行的终端仿真器(xterm,screen,sshd等)。启动一个新的终端模拟器。如果终端模拟器是本机Mac应用程序,则可能是我不知道的Mac特定的细节。
吉尔斯(Gillles)“所以-别再作恶了”

ps -o tty= -p$$ ps -o tty= -p$PPID ,因为您说过它们应该产生不同的输出。还是我误会了什么?
phunehehe

@phunehehe:如果外壳程序的父进程是终端仿真器,则它们会提供不同的输出,因为终端仿真器没有其仿真终端作为控制终端。如果您发现其他问题,请发布输出ps -p $$ -p $PPID(同样,我没有OSX经验,因此OSX上可能发生了异常情况)。
吉尔(Gilles)“所以,别再邪恶了”,2010年

@吉尔斯:这的确与OSX不同。我在Gentoo上进行了测试,一切都如您所说的正确。在OSX上,ps -p $$ -p $PPID给出(抱歉,我不知道如何格式化注释)PID TTY TIME CMD 209 ttys000 0:00.01 login -pf phunehehe 210 ttys000 0:00.12 -bash
phunehehe 2010年

1

不是很优雅,但是您可以在htop中使用树形视图查看外壳程序与其他运行过程的父子关系。

$ htop # then press 't' and scroll around or 'Ctrl-W' to find your shell proccess

并使用它推断出到达“根”外壳之前需要退出的外壳数量


1

您可以使用环境变量SHLVL

echo "$SHLVL"

1
如果您使用ssh例如同一帐户,那么它仍然是1
Anthon

0

我发现

$ pstree -u | grep ${USER}

有助于了解我在系统中的“适合位置”。我喜欢它pstree -u ${USER}

有时它会提醒我,我离开了nohup工作岗位或类似职位。

(我也使用alias grep='grep --color=auto'。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.