我想在bash提示符中显示嵌套子 shell 的数量。

我经常在vim编辑过程中键入“:sh”以执行某些操作,然后返回编辑器。有时我会出于习惯退出编辑器,忘记了我不在任何编辑 session 中,并且终端关闭了!

为避免这种情况,我在.bashrc中添加了一些代码,该代码将保留嵌套子shell数量的计数并在提示符下显示它。

这是代码:

echo "1: SHLVL=$SHLVL"

if [[ -z $SHPID ]] ; then

 echo "2: SHLVL=$SHLVL"

 SHPID=$$

 let "SHLVL = ${SHLVL:0} + 1"
fi

echo "3: SHLVL=$SHLVL"

(对于那些可能会感到奇怪的人,测试“-z $ SHPID”可以确保如果我在同一shell中再次运行“.bashrc”,则$ SHLVL不会再次递增)。

但是输出看起来像这样:
lsiden@morpheus ~ (morpheus) (2) $ bash
1: SHLVL=3
2: SHLVL=3
3: SHLVL=4
lsiden@morpheus ~ (morpheus) (4) $ ps
PID TTY          TIME CMD
10421 pts/2    00:00:00 bash
11363 pts/2    00:00:00 bash
11388 pts/2    00:00:00 ps

如您所见,堆栈上现在有两个bash实例,但是变量$ SHLVL已经增加了两次。输出显示,即使在我的.bashrc中执行此代码段之前,SHLVL已经加1!

.bashrc是否有可能以某种方式运行两次而没有看到echo命令的输出?

最佳答案

每当启动 shell 时,SHLVL都会自动增加:

~$ echo $SHLVL
1
~$ bash -c 'echo $SHLVL'
2

然后在.bashrc中再次增加它。

10-06 06:40