当您调用$SHLVL(或其别名/bin/sh)时,会将脚本插入当前的bash进程中。 因此,您可以读取脚本设置的变量。
当您调用$SHLVL时,您将启动一个运行新会话/bin/sh的派生(子进程),该会话通常是指向bash的符号链接。在这种情况下,当子脚本设置为-时,将删除由子脚本设置的环境变量。 脚本完成。
警告:$SHLVL可能是到另一个外壳的符号链接。
一个小样本
例如,如果要通过特定方式更改当前工作目录,则无法执行
cat <myCd2Doc.sh
#!/bin/sh
cd /usr/share/doc
eof
chmod +x myCd2Doc.sh
这不会达到您的期望:
cd /tmp
pwd
/tmp
~/myCd2Doc.sh
pwd
/tmp
因为当前的工作目录是环境的一部分,因此$SHLVL将在子外壳中运行。
但:
cat >myCd2Doc.source <
# Shell source file
myCd2Doc() {
cd /usr/share/doc
}
eof
. myCd2Doc.source
cd /tmp
pwd
/tmp
myCd2Doc
pwd
/usr/share/doc
(我写了一个$SHLVL函数的小样本。)
执行级别$SHLVL
cd /tmp
printf %b '\43\41/bin/bash\necho This is level \44SHLVL.\n' >qlvl.sh
bash qlvl.sh
This is level 2.
source qlvl.sh
This is level 1.
很少递归
cat <qlvl.sh
#!/bin/bash
export startLevel
echo This is level $SHLVL starded:${startLevel:=$SHLVL}.
((SHLVL<5)) && ./qlvl.sh
eoqlvl
chmod +x qlvl.sh
./qlvl.sh
This is level 2 starded:2.
This is level 3 starded:2.
This is level 4 starded:2.
This is level 5 starded:2.
source qlvl.sh
This is level 1 starded:1.
This is level 2 starded:1.
This is level 3 starded:1.
This is level 4 starded:1.
This is level 5 starded:1.
并进行最终测试:
printf %b '\43\41/bin/bash\necho Ending this.\nexit 0\n' >finalTest.sh
bash finalTest.sh
Ending this.
source finalTest.sh
Ending this.
...您可能会注意到两种语法之间的行为有所不同。 ;-)