SHLVL

执行 bash 命令时,将打开一个新 shell。 $ SHLVL 环境变量保存当前 shell 运行的 shell 级别数。

新的终端窗口中,执行以下命令将根据正在使用的 Linux 发行版生成不同的结果。

echo $SHLVL

使用 Fedora 25 ,输出为 3。这表明,在打开新 shell 时,初始 bash 命令会执行并执行任务。初始 bash 命令执行子进程(另一个 bash 命令),然后执行最终 bash 命令以打开新 shell。当新 shell 打开时,它作为 2 个其他 shell 进程的子进程运行,因此输出为 3

在下面的示例中(假设用户正在运行 Fedora 25),新 shell 中$ SHLVL 的输出将设置为 3。执行每个 bash 命令时,$ SHLVL 递增 1。

~> $ echo $SHLVL
3
~> $ bash
~> $ echo $SHLVL
4
~> $ bash
~> $ echo $SHLVL
5

可以看到执行’bash’命令(或执行 bash 脚本)会打开一个新的 shell。相比之下,获取脚本会运行当前 shell 中的代码。

test1.sh

#!/usr/bin/env bash
echo "Hello from test1.sh. My shell level is $SHLVL"
source "test2.sh"

test2.sh

#!/usr/bin/env bash
echo "Hello from test2.sh. My shell level is $SHLVL"

run.sh

#!/usr/bin/env bash
echo "Hello from run.sh. My shell level is $SHLVL"
./test1.sh

执行:

chmod +x test1.sh && chmod +x run.sh
./run.sh

输出:

Hello from run.sh. My shell level is 4
Hello from test1.sh. My shell level is 5
Hello from test2.sh. My shell level is 5