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

Eug*_*e S 6 shell bash solaris

我正在尝试确定 bash 解释器在我的 Solaris 系统上的位置,但我有点困惑。当我输入:

echo $SHELL
Run Code Online (Sandbox Code Playgroud)

结果路径是:

/bin/bash
Run Code Online (Sandbox Code Playgroud)

当我输入时:

which bash
Run Code Online (Sandbox Code Playgroud)

我得到:

/usr/bin/bash
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释这种差异吗?

jw0*_*013 9

您的系统可能已bash安装在多个位置,无论是作为不同版本的bash还是只是符号链接。

which对于大多数用途来说,这并不是一个真正有用的命令——它在脚本中并不是真正可移植的或非常有用。一般来说,type是更好的。背后的想法whichPATH搜索您作为参数提供的命令。

$SHELL不一定反映当前运行的 shell。相反,$SHELL是用户的首选 shell,通常是/etc/passwd. 如果登录后启动不同的shell,不一定能指望$SHELL再匹配当前的 shell。

如您所见,$SHELL并且which完全无关。这些都不会告诉您实际运行的是什么 shell。

旁注:不幸的是,将您当前运行的 shell 与文件系统中的某个位置相匹配比人们想象的要困难。这是因为二进制文件是为了运行而加载到内存中的,并且在大多数系统中,即使从磁盘中删除原始文件,内存中的副本仍将继续正常运行(内核可能会将磁盘副本保留在“limbo”中,直到它被真的不再需要了)。我认为没有任何可移植的方法来解决这个问题 - 您必须求助于特定于平台的方法。例如,在 Linux 上,检查链接/proc/$$/exe应该能让您清楚地了解正在运行的文件(正在$$运行的 shell 的进程 ID在哪里)。不幸的是,我对 Solaris 不熟悉,所以我无法帮助你。


bah*_*mat 8

其他答案都很好,但我喜欢做示范。

% echo $SHELL
/bin/zsh
% which bash
/bin/bash
Run Code Online (Sandbox Code Playgroud)
  • 第一个命令告诉我login登录时将执行哪个 shell 。在我的情况下,/bin/zsh .
  • 第二个命令告诉我可以找到我$PATHbash命令中的第一次出现。

一个并不意味着第二个,反之亦然。

我不打算重申其他人的答案,但除此之外,我想指出一些事情。

  • Solaris 上的默认 shell 是 /bin/bash
  • 在 Solaris 上/bin是一个符号链接./usr/bin
  • $PATHSolaris 上的默认值是/usr/bin:/bin

这就是为什么你会看到这种行为。

  • 第一个命令显示您的默认 shell,它可能是您当前正在运行的 shell,但并非总是如此。 (2认同)