为什么运行新 shell 时 $SHELL 不会改变?

rus*_*ush 14 shell environment-variables

 $ echo $SHELL
/bin/bash
 $ /bin/ksh93
 $ echo $SHELL
/bin/bash
 $ file /bin/ksh93
/bin/ksh93: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 
dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped

 $ getent passwd test111
test111:x:1008:1008:,,,:/tmp:/bin/ksh93
 $ ssh test@localhost
test@localhost's password:
 $ echo $SHELL
/bin/ksh93
 $ bash
 $ echo $SHELL
/bin/ksh93
Run Code Online (Sandbox Code Playgroud)

我希望$SHELL在运行另一个 shell 后改变。为什么不呢?

PS 但是外壳确实发生了变化,只有 $SHELL 变量保持不变:

 $ dash
 $ echo $SHELL
/bin/bash
 $ T=test ; [[ $T = *est ]] && echo ok
dash: [[: not found
Run Code Online (Sandbox Code Playgroud)

jll*_*gre 14

你不应该期望这个变量会改变。它用于存储默认shell 的路径,即存储在密码数据库中的路径,而不是您当前正在运行的shell。


Cir*_*郝海东 8

SHELL由POSIX指定。引用:

SHELL 这个变量代表用户首选的命令语言解释器的路径名。[...]

运行不同的 shell 并不一定表示用户偏好的变化。

了解 POSIX 指定的事物类型以及在哪里搜索它们是很好的,因为大多数 *.nix 系统旨在符合 POSIX。环境变量就是其中之一。