![“echo $SHELL”和“which bash”之间的区别](https://linux22.com/image/24092/%E2%80%9Cecho%20%24SHELL%E2%80%9D%E5%92%8C%E2%80%9Cwhich%20bash%E2%80%9D%E4%B9%8B%E9%97%B4%E7%9A%84%E5%8C%BA%E5%88%AB.png)
我正在尝试确定 bash 解释器在 Solaris 系统上的位置,但我有点困惑。当我输入:
echo $SHELL
结果路径是:
/bin/bash
当我输入:
which bash
我得到:
/usr/bin/bash
谁能解释一下这种差异吗?
答案1
您的系统可能已bash
安装在多个位置,无论是作为不同版本bash
还是只是符号链接。
which
并不是一个真正有用的命令对于大多数目的 - 它在脚本中并不是真正可移植或非常有用的。一般来说,type
比较好。背后的想法which
是搜索PATH
您作为参数给出的命令。
$SHELL
不一定反映当前运行的 shell。反而,$SHELL
是用户首选的 shell,通常是在 中设置的/etc/passwd
。如果您在登录后启动不同的 shell,则不一定能够$SHELL
再匹配当前的 shell。
正如你所看到的,$SHELL
和which
是完全无关的。这些都不会告诉您实际运行的 shell 是什么。
旁注:不幸的是,将当前运行的 shell 与文件系统中的某个位置相匹配比人们想象的要困难。这是因为二进制文件被加载到内存中以便运行,并且在大多数系统中,即使在从磁盘中删除原始文件之后,内存中的副本也将继续正常运行(内核可能会将磁盘副本保留在“地狱边缘”,直到它被删除为止)。确实不再需要)。我认为没有任何可移植的方法可以解决这个问题 - 您必须诉诸平台特定的方法。例如,在 Linux 上,检查链接/proc/$$/exe
应该能让您清楚地了解什么文件正在运行(其中$$
是正在运行的 shell 的进程 ID)。不幸的是我对 Solaris 不熟悉,所以我无法帮助你。
答案2
其他答案都很好,但我想演示一下。
% echo $SHELL
/bin/zsh
% which bash
/bin/bash
login
第一个命令告诉我登录时将执行哪个 shell 。在我的例子中,/bin/zsh
.- 第二个命令告诉我可以找到该命令
$PATH
中的第一个匹配项。bash
第一个并不意味着第二个,反之亦然。
我不会重述其他人的答案,但除此之外我想指出一些事情。
- Solaris 上的默认 shell 是
/bin/bash
- 在 Solaris 上
/bin
是一个符号链接./usr/bin
$PATH
Solaris 上的默认值是/usr/bin:/bin
这就是您看到这种行为的原因。
答案3
echo $SHELL
显示的值SHELL
环境变量。这是一个用户配置,您可以将其设置为您最喜欢的交互式 shell 的路径。许多程序$SHELL
在被要求调用 shell 时都会调用。
我认为所有 shell 都会保留此变量,除非在启动时未设置它。SHELL
如果该变量在启动时未设置,Bash 将设置为自己的路径。如果未设置,则ATT ksh93 设置SHELL
为/bin/sh
(即使/bin/sh
是某些不相关的 shell)。 Ksh(所有版本)检查是否SHELL
启动rsh
;如果是,它开始为受限外壳。
which bash
显示 bash 可执行文件的路径(除非不- 你应该使用type bash
)。更准确地说,它在目录中搜索$PATH
名为 的可执行文件bash
。
echo $0
在交互式 shell 中,显示用于调用 shell 的命令名称。
ps $$
(从 shell 键入)显示有关 shell 进程的信息($$
扩展为 shell 的进程 ID)。
ls -l /proc/$$/exe
显示 shell 可执行文件的完整路径
例如,我最喜欢的 shell 是 zsh,但在这里我刚刚启动了 bash 的家庭编译版本,该版本不在$PATH
.
% ./bash
$ echo $SHELL
/bin/zsh4
$ type bash
bash is /usr/bin/bash
$ echo $0
./bash
$ readlink /proc/$$/exe
/home/gilles/src/bash-git/bash
$ pwd
/home/gilles/src/bash-git
$ rm bash
$ echo $0
./bash
$ readlink /proc/$$/exe
/home/gilles/src/bash-git/bash (deleted)
答案4
$SHELL
是一个环境变量,设置了当前登录 shell 的路径,在本例中为 bash。如果您要使用该chsh
命令切换到其他 shell(例如 zsh),那么您将/bin/zsh
在运行时看到echo $SHELL
.
该which
命令实际上与特定的 shell 无关,只是负责确定直接调用该程序时将运行哪个程序。您的 $PATH 变量中的路径中可能有该程序的多个版本可以运行。您/bin/bash
在运行时看到的原因which bash
是因为这是系统首先bash
在层次结构中找到程序的位置,即$PATH
。
你可以which
运行任何命令,而不仅仅是一个 shell。