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)初始化的。login
passwd
该变量用于告诉诸如...之类的应用程序xterm
,vim
它们在启动 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 中。