$SHELL 是否存储 Linux 中默认 shell 的路径?

$SHELL 是否存储 Linux 中默认 shell 的路径?

我的管理员说我的默认 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/useraddshell 在文件中定义。

你的默认shell 在文件中定义/etc/passwd。您可以通过chsh命令来更改它。

变量$SHELL通常存储当前的shell 可执行文件路径。每个 shell 在这一点上的行为都不同。例如,如果 shell 变量在启动时未设置,则 bash 会设置该变量,否则保持不变。 tcsh 根本不支持这个变量。

答案4

我一直认为环境变量可以为您正在运行的程序提供建议。 $SHELL 是您希望程序在需要运行 shell 时启动的 shell。与 $EDITOR 相比,您的电子邮件程序可能会使用它来决定为您提供哪个编辑器。 B/c 这些环境变量很容易改变,你不能真正依赖它们来决定世界到底是什么样子。

与您关于默认 shell 的问题相关: chsh 是一个允许您更改登录 shell 的命令。在更改之前,它会显示您当前的选择是什么。

相关内容