在 Debian squeeze 上。运行ps -p $$
显示bash
的是我当前的 shell,ls -l $(which sh)
显示的sh
是 的符号链接bash
。那么为什么当我运行 时man sh
,会得到 的手册页dash
?这只是 Debian 中的一个错误吗?
答案1
系统默认 shell 与您的用户 shell 不同。在我的系统上,dash
是系统默认的,但我bash
在登录时使用:
anthony@Zia:~$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 1 2012 /bin/sh -> dash
因此,带有 up top 的 shell 脚本#!/bin/sh
使用 dash 运行。
听起来您的系统似乎有一半是 /bin/sh 符号链接,而另一半是 manpage 符号链接不同步。我的系统上的 manpage 符号链接是:
anthony@Zia:~$ ls -l /usr/share/man/man1/sh.1.gz
lrwxrwxrwx 1 root root 9 Mar 1 2012 /usr/share/man/man1/sh.1.gz -> dash.1.gz
如果你手动更改了 /bin/sh,你也必须更改它。处理这些符号链接时可能也存在错误;mpy 指出错误 #662159。
每个用户都有一个设置,用于设置登录时调用哪个 shell。这是每个用户的设置,存储在 中/etc/passwd
,因此系统范围的手册页无法反映它。每个用户都可以通过运行来更改自己的 shell 设置chsh
(当然,root 可以更改其他用户的 shell 设置)。
还有一个SHELL
环境变量,它在登录时设置,但可以更改。通常,/etc/passwd
当xterm
需要启动 shell 时,它会覆盖 for 中的 shell 字段。
答案2
总结/bin/sh 在其他 UNIX(Solaris)中曾经是一个完全不同的 shell,但在 Linux 中是 Bash,但 Debian 决定拥有一个自定义 /bin/sh shell由于各种原因(主要是代码大小)。
原始 shell 是 Bourne shell。POSIX 规则要求将 Bourne 兼容 shell 安装为 /bin/sh。这是您请求时获得的结果man sh
。
Bourne shell 实际上还很原始。它没有很多人们想要的命令解释器中的交互功能。它没有历史机制、没有别名等。因此进行了一些添加。首先是 tcsh,然后是 Korn shell,然后是 Bash。
当你制作 Linux 发行版时,你需要遵循 /bin/sh 的 POSIX 规则。他们看到“嘿,我们有 Bash,它是从 Bourne shell 向前兼容的 shell”。我们为什么不从中剥离一些功能并将其安装为 /bin/sh?大多数发行版都这样做了。
但是这样做也存在一些问题。Bash 有很多功能(readline 绑定、可编程完成、字典数组等),而且占用的内存实际上相当大,并且有一些库依赖项。当您处于“我的系统崩溃”模式时,这些功能并不是特别好。您更关心的是让您的系统启动,而不是担心我此时是否有一个完全可编程的提示符。
因此,Debian 团队回到了未来,并拥有一个专门的、精简的 Bourne shell 作为 /bin/sh。它更小,依赖性更少,理论上在启动时可以更可靠。缺点是可能存在依赖于 /bin/sh 的启动脚本,而 /bin/sh 实际上是底层的 Bash,并且可能使用这些功能。但这些脚本的编码不符合规范,应该修复。