我怎么知道我是否运行嵌套的shell?
当使用* nix shell(通常是bash)时,我经常产生一个子shell,我可以用它来处理一个小任务(通常在另一个目录中),然后退出以恢复父shell的会话。
有一段时间,我会忽略是运行一个嵌套的shell,还是运行在我的顶层shell中,而且我会意外地产生一个额外的子shell或者错误地退出顶层shell 。
有没有一种简单的方法来确定我是否在嵌套shell中运行? 还是我用完全错误的方式去解决我的问题(通过产生子弹)?
$SHLVL
variables跟踪你的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的发行版中, pstree
是psmisc
一部分。 它可能不会默认安装在非桌面版本上。
如果你在子shell里面运行下面的代码会得到2:
ps | fgrep bash | wc -l
否则,它会产生1。
编辑好吧,这是不是如在评论中指出的那么强大的方法:)
另一个尝试是
ps -ef | awk '{print $2, " ", $8;}' | fgrep $PPID
如果你在子shell中会产生“bash”。