SHLVL 环境变量代表 Shell 嵌套执行的深度。
$ echo $SHLVL 1 $ bash $ echo $SHLVL 2 $ bash $ echo $SHLVL 3 |
在 Bash 里,这个值的范围是 [0, 1000],0 是怎么来的呢?是在上次的 SHLVL 值为负数的时候:
$ SHLVL=-1 $ bash $ echo $SHLVL 0 |
当 SHLVL 的值超过 1000 时,会自动重置到 1。
$ SHLVL=1000 $ bash bash: warning: shell level (1001) too high, resetting to 1 $ echo $SHLVL 1 |
我也本以为就是这样了,然而却发现个特例:
$ SHLVL=999 $ bash $ echo $SHLVL |
在嵌套 1000 层的时候,SHEVL 看起来是个空字符串,但在 Shell 里很多东西眼见都不为实,所以我们用 16 进制看看:
$ SHLVL=999 bash -c 'echo -n "$SHLVL" | hexdump' 0b 01 $ SHLVL=999 bash -c 'echo -n "$SHLVL" | hexdump' 0f 01 $ SHLVL=999 bash -c 'echo -n "$SHLVL" | hexdump' 04 01 |
这个值原来是个随机字符串,在我的 Mac 上是两个控制字符(不可见字符),所以看起来像是空字符串。而在另外一台 Red Hat 上执行了下是一些肉眼可见的乱码:
$ SHLVL=999 bash -c 'echo "$SHLVL"' �[g� |
总之,也就是说 SHEVL 实际的值会在 [0, 999] 以及这个不确定的值这 1001 个值里轮询,不会真正到达 1000。
看了下 Bash 源码:
void adjust_shell_level (change) int change; { char new_level[5], *old_SHLVL; intmax_t old_level; SHELL_VAR *temp_var; old_SHLVL = get_string_value ("SHLVL"); if (old_SHLVL == 0 || *old_SHLVL == '