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)
任何人都可以解释这种差异吗?
您的系统可能已bash
安装在多个位置,无论是作为不同版本的bash
还是只是符号链接。
which
对于大多数用途来说,这并不是一个真正有用的命令——它在脚本中并不是真正可移植的或非常有用。一般来说,type
是更好的。背后的想法which
是PATH
搜索您作为参数提供的命令。
$SHELL
不一定反映当前运行的 shell。相反,$SHELL
是用户的首选 shell,通常是/etc/passwd
. 如果登录后启动不同的shell,不一定能指望$SHELL
再匹配当前的 shell。
如您所见,$SHELL
并且which
完全无关。这些都不会告诉您实际运行的是什么 shell。
旁注:不幸的是,将您当前运行的 shell 与文件系统中的某个位置相匹配比人们想象的要困难。这是因为二进制文件是为了运行而加载到内存中的,并且在大多数系统中,即使从磁盘中删除原始文件,内存中的副本仍将继续正常运行(内核可能会将磁盘副本保留在“limbo”中,直到它被真的不再需要了)。我认为没有任何可移植的方法来解决这个问题 - 您必须求助于特定于平台的方法。例如,在 Linux 上,检查链接/proc/$$/exe
应该能让您清楚地了解正在运行的文件(正在$$
运行的 shell 的进程 ID在哪里)。不幸的是,我对 Solaris 不熟悉,所以我无法帮助你。
其他答案都很好,但我喜欢做示范。
% echo $SHELL
/bin/zsh
% which bash
/bin/bash
Run Code Online (Sandbox Code Playgroud)
login
登录时将执行哪个 shell 。在我的情况下,/bin/zsh
.$PATH
的bash
命令中的第一次出现。一个并不意味着第二个,反之亦然。
我不打算重申其他人的答案,但除此之外,我想指出一些事情。
/bin/bash
/bin
是一个符号链接./usr/bin
$PATH
Solaris 上的默认值是/usr/bin:/bin
这就是为什么你会看到这种行为。