这里不多解释。只是想知道为什么 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
(您的登录外壳)。
该变量用于告诉应用程序,例如xterm
,vim
...当它们启动 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
或文件。.login
shell -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