“echo $SHELL”和“which bash”之间的区别

“echo $SHELL”和“which bash”之间的区别

我正在尝试确定 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。

正如你所看到的,$SHELLwhich是完全无关的。这些都不会告诉您实际运行的 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
  • $PATHSolaris 上的默认值是/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。

相关内容