我怎么知道我是否运行嵌套的shell?

当使用* nix shell(通常是bash)时,我经常产生一个子shell,我可以用它来处理一个小任务(通常在另一个目录中),然后退出以恢复父shell的会话。

有一段时间,我会忽略是运行一个嵌套的shell,还是运行在我的顶层shell中,而且我会意外地产生一个额外的子shell或者错误地退出顶层shell 。

有没有一种简单的方法来确定我是否在嵌套shell中运行? 还是我用完全错误的方式去解决我的问题(通过产生子弹)?

$SHLVLvariables跟踪你的shell嵌套级别:

 $ echo $SHLVL 1 $ bash $ echo $SHLVL 2 $ exit $ echo $SHLVL 1 

作为产生子shell的替代方法,你可以从栈中推送和popup目录并保留在同一个shell中:

 [root@localhost /old/dir]# pushd /new/dir /new/dir /old/dir [root@localhost /new/dir]# popd /old/dir [root@localhost /old/dir]# 

以下是我的提示的一部分的简化版本:

 PS1='$(((SHLVL>1))&&echo $SHLVL)\$ ' 

如果我不在子shell中,它不会添加任何额外的东西,但是如果我处于任何子shell级别,它将显示深度。

$0 :如果它以一个减号开始,那么你在loginshell。

pstree -s $$对于查看您的深度非常有用。

ptree $$也会告诉你你有多深

环境variables$SHLVL包含shell“深度”。

 echo $SHLVL 

shell深度也可以使用pstree (版本23及以上)来确定:

 pstree -s $$ | grep sh- -o | wc -l 

我发现第二种方法比第一种方法更强大,当使用sudo时它的值被重置或者在env -i变得不可靠。

他们都不能正确处理su


信息可以在提示中提供:

 PS1='\u@\h/${SHLVL} \w \$ ' PS1='\u@\h/$(pstree -s $$ | grep sh- -o | tail +2 | wc -l) \w \$ ' 

| tail +2 | tail +2是从grep输出中删除一行。 由于我们在“ $(...) ”命令replace中使用了一个pipe道,因此shell需要调用一个子shell,所以pstree会报告它,并且grep会检测到更多的sh-级别。


在基于debian的发行版中, pstreepsmisc一部分。 它可能不会默认安装在非桌面版本上。

如果你在子shell里面运行下面的代码会得到2:

 ps | fgrep bash | wc -l 

否则,它会产生1。

编辑好吧,这是不是如在评论中指出的那么强大的方法:)
另一个尝试是

 ps -ef | awk '{print $2, " ", $8;}' | fgrep $PPID 

如果你在子shell中会产生“bash”。