zsh在/usr/bin中,也在/bin中,有什么区别?

brg*_*rgr 7 zsh

/etc/shells 说它已经zsh安装/bin/zsh/usr/bin/zsh.

brgr@envy17:~$ cat /etc/shells 
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/tmux
/usr/bin/screen
/bin/zsh        <--
/usr/bin/zsh    <--
Run Code Online (Sandbox Code Playgroud)

现在,互联网建议我使用/usr/bin/.

我的问题是:为什么?这两者之间有什么区别,为什么 bash 例如只安装在一个路径 ( /bin/bash) 上?

zor*_*lem 10

的内容/etc/shells或多或少是静态的,与系统上安装的特定 shell 的存在无关。

有你的两个项目的事实/etc/shells仅仅意味着,如果用户有两种/bin/zsh/usr/bin/zsh指定为自己的壳/etc/passwd,他们都将被守护进程咨询认为“有效” /etc/shells(如大多数FTP守护进程)。

要查看路径 ($PATH) 中第一个可用的 zsh,您可以使用 which 命令,如下所示:

which zsh
Run Code Online (Sandbox Code Playgroud)

或者 whereis,它显示更多信息(命令的二进制文件、源文件和手册页文件):

whereis zsh
Run Code Online (Sandbox Code Playgroud)


mdp*_*dpc 9

一个可能是另一个的符号链接(或硬链接).....但它们是相同的文件。

  • 要检查,请使用`ls -l`。如果一个是另一个的链接,你会看到`linkedName -&gt; /path/targetName` (4认同)
  • @kmort 那只会检查它是否是符号链接。对于硬链接,在 `ls -l` 输出中,您会看到链接计数 &gt; 1,如果您对它们进行 `stat`,则 inode 编号将相同。 (4认同)

小智 5

/bin/zsh存在时, 的冗余存在/usr/bin/zsh主要是为了可移植性,因为您不需要编辑每个和任何脚本的shebang行,当使用时,它zsh可能会解决/usr/bin/zsh.

zsh不被视为标准软件,但越来越多的人在使用它,甚至是铁杆系统管理员。这就是为什么更多的发行版也倾向于将其放入的原因/bin/zsh

要开门见山:这不是一个zsh问题,而是一个功能,这应该保证启动Linux(或历史,UNIX)系统进入定义的状态。

/bin被定义为驻留在根文件系统中,而/usr/bin不是。

对于后者(以及其他),选项包括将它放在另一个磁盘(分区)甚至另一台机器上,并通过 NFS 或其他网络方式安装。

因此,当在没有网络支持的情况下启动系统时,或者在网络意外中断的情况下,或者当磁盘崩溃或文件系统损坏时,或者只是在没有安装任何内容的情况下启动到单用户模式时,/bin仍然可以访问其中的文件。

这同样适用于/liband /usr/lib:事实上,任何超出的东西都/usr被认为对基本系统来说不是至关重要的(X11 通常也可以在/usr分支的某个地方找到。这也是 root 的 $HOME 不是的原因/home/root,因为/home也被认为不是驻留在根文件系统中。

如果系统盘崩溃了?还是根文件系统损坏了?那么,很有可能你甚至无法加载内核......

以上大部分内容对于当今的系统来说并不是太重要。NFS 挂载的/usr/*文件系统是不必要的,因为磁盘空间很便宜并且有大量可用空间。

/boot在许多安装中,甚至 OS 映像都安装到单独的文件系统中,因此加载内核并不能保证能够挂载根文件系统,但为此我们现在有initrd一个可用的初始根文件系统内核启动(实际上zsh在大多数情况下会丢失)。

拥有包含/usr分支的大型根文件系统也是一种常见做法,这在克隆安装时具有一些优势。

因此,导致区分/bin/usr/bin(等)的传统考虑有点过时,但仍在最近的系统中实施。

(这更像是旁白,但这些都是事实)