为什么当我运行新 shell 时 $SHELL 没有改变?

为什么当我运行新 shell 时 $SHELL 没有改变?
 $ 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

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

PS 然而 shell 确实发生了变化,只有 $SHELL 变量保持不变:

 $ dash
 $ echo $SHELL
/bin/bash
 $ T=test ; [[ $T = *est ]] && echo ok
dash: [[: not found

答案1

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

答案2

SHELL由 POSIX 指定。引用:

SHELL 该变量应表示用户首选命令语言解释器的路径名。 [...]

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

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

答案3

SHELL 变量存储您会话的父 shell,有时与您的默认登录 shell 匹配。 $SHELL 是生成当前会话的父 shell。

所以,如果我为我的用户使用 bash 并执行以下操作:chsh -s /bin/zsh user,当我这样做时echo $SHELL,显示的 shell 仍将是BASH.

本文

相关内容