是.bashrc进入一个新的bash实例时运行两次?

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

我经常在vim编辑会话中input“:sh”来执行某些操作,然后退回到编辑器。 有时我会试图退出编辑器,忘记我没有进行任何编辑,我的terminalclosures了!

为了避免这种情况,我在我的.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" 

(对于那些可能想知道的问题,testing“-z $ SHPID”确保$ SHLVL不会再次增加,如果我再次在同一个shell中运行“.bashrc”,也许testing一下。)

但是输出如下所示:

 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实例,但是variables$ SHLVL已经增加了两次。 输出结果显示,在这段代码甚至在我的.bashrc中执行之前,SHLVL已经增加了1!

有没有可能使.bashrc得到运行两次,而不看到回声命令的输出?

每当你启动一个shell时, SHLVL自动增加:

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

然后在.bashrc再次递增。