linux - 输入新的 bash 实例时 .bashrc 是否运行两次?

标签 linux bash shell

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

我经常在 vim 编辑 session 期间输入“: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”(也许是为了测试某些内容),$SLVL 不会再次增加。)

但是输出看起来像这样:

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 实例,但变量 $SLVL 已递增两次。输出显示,在我的 .bashrc 中执行这段代码之前,SLVL 已经增加了 1!

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

最佳答案

SLVL 每当您启动 shell 时都会自动递增:

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

然后您在 .bashrc 中再次递增它。

关于linux - 输入新的 bash 实例时 .bashrc 是否运行两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20035663/

相关文章:

linux - 为什么所有环境变量都加载到进程的堆栈中?

python - 使用 Python 在 Linux 中获取系统音量(声音级别)

node.js - 无法在 Windows 上提供 Angular 项目

Java进程执行 "tail -f test.log | grep abc"无法得到任何输出

mysql - 如何提取分隔符前后的字符串并存储在mysql中?

linux - 如何从 Bash 脚本运行无限循环并输出到前台

c++ - 如何在google code jam中输入c++代码的测试用例

c++ - OpenMP编译执行

linux - 在 bash 中使用命令行创建用户

bash - 在 bash 中,当 B 列具有相同内容时,如何将 A 列中的所有数字相加?