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

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

这里不多解释。只是想知道为什么 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

答案1

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

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

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

readlink "/proc/$$/exe"

等价rc的:

readlink /proc/$pid/exe

等价fish的:

set pid %self
readlink /proc/$pid/exe

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

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

在:

$ bash -c 'echo "$0"'
bash
$ /bin/bash -c 'echo "$0"'
/bin/bash

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

$ (exec -a whatever bash -c 'echo "$0"')
whatever

在 ksh/bash/zsh/yash 中。

答案2

如果命令的输出echo $0是 -bash 则意味着 bash 被作为登录 shell 调用。如果输出仅是 bash,那么您处于非登录 shell 中。

ENV被触发以显示所需的输出时,它会为您提供/bin/bash

[root@dcconnect ~]# env | grep -i SHELL
SHELL=/bin/bash

输出echo #SHELL是从ENV变量中提取的

答案3

$0是启动 shell 的命令。$SHELL是您系统中的默认 shell

相关内容