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


14
 $ 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变量保持不变:

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

2
使用echo $0来获取当前壳
Manula Waidyanatha

Answers:


13

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


8

SHELL由POSIX指定。报价单:

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

运行不同的外壳程序不一定表示用户的偏好发生了变化。

了解POSIX指定的事物类型以及在何处进行搜索是一件好事,因为大多数* .nix系统都针对POSIX合规性。环境变量就是其中之一。


-3

SHELL变量存储会话父外壳程序,有时与默认登录外壳程序匹配。$ SHELL是产生当前会话的父外壳。

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

看到这篇文章


4
您链接到的文章不正确。这是另一回事,即SHELL存储您的默认登录Shell(在最后一次登录时间),有时与您的父Shell匹配。您的父级或当前Shell永远不会修改此变量。他们唯一可以做的就是设置它(如果没有设置)。
jlliagre 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.