为什么 echo $SHELL 总是显示 /bin/bash?

Sha*_*yas 17 shell bash environment-variables

这里没有太多解释。只是想知道为什么 echo $SHELL 总是给出输出 /bin/bash 即使我切换到其他 shell。我该怎么做才能确保 $SHELL 给出我所在的正确 shell 路径。

[root@localhost user]# echo $0
bash
[root@localhost user]# echo $SHELL
/bin/bash
[root@localhost user]# csh
[root@localhost user]# echo $0
csh
[root@localhost user]# echo $SHELL
/bin/bash
[root@localhost user]# tcsh
[root@localhost user]# echo $0
tcsh
[root@localhost user]# echo $SHELL
/bin/bash
[root@localhost user]# sh
sh-4.2# echo $0
sh
sh-4.2# echo $SHELL
/bin/bash
sh-4.2# 
[root@localhost user]# which csh
/bin/csh
[root@localhost user]# which csh
/bin/csh
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 35

$SHELL是保存首选 shell环境变量,而不是当前运行的 shell。它是由或任何其他应用程序根据数据库中用户条目中的shell字段(您的登录 shell)初始化的。loginpasswd

该变量用于告诉诸如...之类的应用程序xtermvim它们在启动 shell 时应该为您启动什么 shell。当您想要使用另一个 shell 而不是passwd数据库中为您设置的 shell 时,通常会更改它。

要获取当前 shell 解释器的路径,在 Linux 上,以及使用 Bourne 或 csh 之类的 shell,您可以执行以下操作:

readlink "/proc/$$/exe"
Run Code Online (Sandbox Code Playgroud)

rc相当于:

readlink /proc/$pid/exe
Run Code Online (Sandbox Code Playgroud)

fish相当于:

set pid %self
readlink /proc/$pid/exe
Run Code Online (Sandbox Code Playgroud)

csh/tcsh 将$shell变量设置为 shell 的路径。

在类似 Bourne 的 shell 中,$0将包含 shell 接收到的第一个参数 ( argv[0]),按照约定是被调用的命令的名称(尽管login应用程序,再次按照约定使第一个字符 a-告诉 shell 它是一个登录 shell,并且应该例如,源.profile.login包含您的登录会话自定义的文件)当不被调用来解释脚本或在shell -c '...'没有额外参数的情况下调用时。

在:

$ bash -c 'echo "$0"'
bash
$ /bin/bash -c 'echo "$0"'
/bin/bash
Run Code Online (Sandbox Code Playgroud)

/bin/bash在这两种情况下都是我的 shell 调用,但在第一种情况下使用bash作为它的第一个参数,在第二种情况下使用/bin/bash. 一些 shell 允许传递任意字符串,例如:

$ (exec -a whatever bash -c 'echo "$0"')
whatever
Run Code Online (Sandbox Code Playgroud)

在 ksh/bash/zsh/yash 中。

  • Stéphane 当然知道这一点,但对于其他人来说,这在 [POSIX 基本定义第 8.3 节](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03) 中有记录。 (4认同)