$ 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
.
看本文。