很多时候我会在项目中使用包装脚本来维护开发过程中的环境变量;
shell.sh
:
#!/bin/bash
export PATH=$PWD/bin:$PATH
export USERNAME=foo
export PASSWORD=bar
export DB_SERVER=http://localhost:6001
bash
这将为项目设置环境,然后启动交互式 bash 会话。这个示例是一个 shell 脚本,但实际上我最常在类似配置的内部执行此操作生成文件配方,如果重要的话。
问题是,当我在这些会话中时,通常很难在视觉上将其与项目环境之外的会话区分开来。也有可能意外地多次运行此类脚本,从而在多个级别的嵌套 bash 会话中运行。
我希望有一种方法可以在命令提示符中显示一些值,该值可以指示bash
已调用了多少次,这样我就可以更轻松地判断我是否处于 bash 子会话中或者是否处于父 bash 会话中。
我看到这里列出了一些 bash 变量: https://www.gnu.org/software/bash/manual/bash.html#Bourne-Shell-Variables
特别是有BASH_SUBSHELL
一个计算子 shell 级别的函数,但由于这实际上不是子 shell,因此不能用于此目的:
$ (echo $BASH_SUBSHELL)
1
$ (echo $BASH_SUBSHELL; bash)
1
$ echo $BASH_SUBSHELL
0
还有其他方法可以维护这个计数器吗?如果是这样,我可以轻松地在 bash 提示符中添加一些内容,以便在终端中更清楚地显示这一点。
这是使用上面的脚本根据评论对不同方法进行的比较:
# inside top-level parent session
$ echo $$ $BASHPID $BASH_SUBSHELL $SHLVL
32336 32336 0 1
# invoke the script to enter a new bash session
$ ./test.sh
$ echo $$ $BASHPID $BASH_SUBSHELL $SHLVL
39541 39541 0 3
$BASH_SUBSHELL
不反映新的 shell 级别