/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)
一个可能是另一个的符号链接(或硬链接).....但它们是相同的文件。
小智 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(等)的传统考虑有点过时,但仍在最近的系统中实施。
(这更像是旁白,但这些都是事实)