![Linux 上的 `ash` 和 `sh` shell 有什么区别?](https://linux22.com/image/203110/Linux%20%E4%B8%8A%E7%9A%84%20%60ash%60%20%E5%92%8C%20%60sh%60%20shell%20%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F.png)
我对 Linux 上的很多工具都是新手。快速搜索没有帮助,我只得到了更多关于bash
或 的信息sh
,并且搜索它在某种程度上倾向于bash
在搜索结果中。那里有很多不同的 shell 类型,我什至见过zsh
,因此我猜它们都是来自 的叉子sh
。
已经有一个问题了使用 bash 和 sh 运行脚本有什么区别?这是类似的:
- 但我找不到 shell 中的“a”代表什么
- 这个问题也不只是关于运行脚本,而是关于 shell 本身 - 因为我可以选择使用
ash
或sh
用于手头的 docker 容器。
我记得ash
会更舒服,但仍然很苗条,我忘了为什么。
ash
和 和之间的主要区别是什么sh
?尺寸、处理方式……?
基本镜像是python:3-alpine
,即使是带有最新标签 (2022-07) 的镜像也同时具有/bin/ash
和/bin/sh
。这两者出现在高山图像中应该是有原因的,而该图像是所有图像中最紧凑的。我用 来称呼它docker-compose -f docker-compose-develop.yaml run --rm MY_CONTAINER ash
。
答案1
历史上,ash
是阿尔姆奎斯特壳。“sh 兼容”是什么意思?给出了它在 -style shell 的整体背景下的历史sh
,以及在哪里可以找到 Almquist Shell 的源代码?解释在哪里可以找到它。
如今,在提供名为 的 shell 的 Linux 系统上ash
,它是dash
或 Busybox ash
,两者都派生自 Almquist Shell,但有显着差异。
在当前的Linux系统上,包括在容器中,存在三种常见场景:
sh
是 Bash(在sh
模式下)——它总是比ash
sh
isdash
(Debian 衍生品) — 在此类系统中,安装ash
将产生从ash
到 的符号链接dash
,因此ash
和sh
具有相同的大小sh
是 Busybox — 具体细节取决于构建 Busybox 时使用的选项,但默认情况下,现在 Busyboxsh
是ash
,因此ash
和sh
具有相同的大小
(在 Android(也是 Linux)上,sh
是mksh
,并且同样的注释适用于 Bash。)
Shell 可以根据调用方式来改变其行为,因此将 shell 启动为ash
或sh
可能会导致不同的体验。然而,据我所知,默认sh
情况下Busybox 的情况并非如此ash
(如容器映像中的情况)。
答案2
我隐约想到的差异让我问什么可能会ash
更舒服,那就是在某些容器中,sh
可能没有自动完成功能。给定的示例容器无法显示这一点。
自动完成意味着您可以写下某个内容的开头,然后按<Tab>
将其作为全名。例如,当瞄准 时cd MY_FOLDER
,cd M
+<Tab>
就足够了,或者当您在另一个文件夹中打开文件并逐步添加子路径时。
据传闻,目前尚不清楚这种情况发生在哪个容器中。我也可能是一个过时的技巧,但是一些旧图像应该仍然存在于过时的版本中。