![$SHELL 是否存储 Linux 中默认 shell 的路径?](https://linux22.com/image/42139/%24SHELL%20%E6%98%AF%E5%90%A6%E5%AD%98%E5%82%A8%20Linux%20%E4%B8%AD%E9%BB%98%E8%AE%A4%20shell%20%E7%9A%84%E8%B7%AF%E5%BE%84%EF%BC%9F.png)
我的管理员说我的默认 shell 设置为bash
,但是
$ echo $SHELL
/bin/csh
$
默认 shell 与该SHELL
变量有关系吗?不是,变量是用来做什么的?
答案1
这并不是100%正确的。例如:
$> echo $SHELL
/bin/bash
$> /bin/ksh
$] echo $SHELL
/bin/bash
$SHELL 包含会话的父 shell,通常是您的登录 shell,由 /etc/passwd 中的用户条目指定。更清楚地说,$SHELL 是生成当前会话的父 shell。在我的示例中,当前 shell Korn 从技术上讲是在 BASH 中运行,这就是 $SHELL 未修改的原因。
显然,这几乎完全是语义上的区别,但是,不要陷入相信所见即所得的陷阱。
答案2
Unix 的“默认 shell”系统管理员是存储在用户数据库的“shell”列中的内容。这是当您以文本模式(在文本模式控制台上,或通过网络,例如 ssh)登录时调用的程序。
Unix 的“默认 shell”应用是sh
或$SHELL
。至于$SHELL
是交互式 shell 还是运行脚本的 shell,存在一些差异。这POSIX规范在这方面含糊不清,反映了不同的实践:
该变量应表示用户首选命令语言解释器的路径名。如果此解释器不符合 IEEE Std 1003.1-2001 的 Shell 和实用程序卷中的 Shell 命令语言,第 2 章,Shell 命令语言,实用程序的行为可能与 IEEE Std 1003.1-2001 中描述的不同。
关于首选命令语言的这一点意味着某些应用程序可能会尝试$SHELL
使用 POSIX shell 命令语法在 中运行命令。然而,在 UNIX 应用程序中运行 shell 命令的正常方法是通过诸如system
,无论环境变量的值如何,它都应该找到合适的 shell $SHELL
。 Bash 和 ksh 是符合 POSIX 标准的 shell 的示例。 Zsh 很接近。 Csh 是不同的,您偶尔可能会因为SHELL
设置为 csh 而遇到麻烦(这并不常见,因为大多数应用程序都会调用sh
,并且 csh 对于基本使用来说足够兼容)。
实际上,对于 Unix用户,$SHELL
是您首选的交互式 shell,即启动终端仿真器时您希望看到的内容。它不必与您的登录 shell 相同:您可以在您的.profile
或.login
.
1
例如,我通常保留默认的登录 shell,维护 Bourne 兼容的.profile
,但SHELL
如果可用则设置为 zsh 。
答案3
不,它与默认 shell 无关。
系统默认/etc/default/useradd
shell 在文件中定义。
你的默认shell 在文件中定义/etc/passwd
。您可以通过chsh
命令来更改它。
变量$SHELL
通常存储当前的shell 可执行文件路径。每个 shell 在这一点上的行为都不同。例如,如果 shell 变量在启动时未设置,则 bash 会设置该变量,否则保持不变。 tcsh 根本不支持这个变量。
答案4
我一直认为环境变量可以为您正在运行的程序提供建议。 $SHELL 是您希望程序在需要运行 shell 时启动的 shell。与 $EDITOR 相比,您的电子邮件程序可能会使用它来决定为您提供哪个编辑器。 B/c 这些环境变量很容易改变,你不能真正依赖它们来决定世界到底是什么样子。
与您关于默认 shell 的问题相关: chsh 是一个允许您更改登录 shell 的命令。在更改之前,它会显示您当前的选择是什么。