Linux 上的 `ash` 和 `sh` shell 有什么区别?

Linux 上的 `ash` 和 `sh` shell 有什么区别?

我对 Linux 上的很多工具都是新手。快速搜索没有帮助,我只得到了更多关于bash或 的信息sh,并且搜索它在某种程度上倾向于bash在搜索结果中。那里有很多不同的 shell 类型,我什至见过zsh,因此我猜它们都是来自 的叉子sh

已经有一个问题了使用 bash 和 sh 运行脚本有什么区别?这是类似的:

  • 但我找不到 shell 中的“a”代表什么
  • 这个问题也不只是关于运行脚本,而是关于 shell 本身 - 因为我可以选择使用ashsh用于手头的 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
  • shis dash(Debian 衍生品) — 在此类系统中,安装ash将产生从ash到 的符号链接dash,因此ashsh具有相同的大小
  • sh是 Busybox — 具体细节取决于构建 Busybox 时使用的选项,但默认情况下,现在 Busyboxshash,因此ashsh具有相同的大小

(在 Android(也是 Linux)上,shmksh,并且同样的注释适用于 Bash。)

Shell 可以根据调用方式来改变其行为,因此将 shell 启动为ashsh可能会导致不同的体验。然而,据我所知,默认sh情况下Busybox 的情况并非如此ash(如容器映像中的情况)。

答案2

我隐约想到的差异让我问什么可能会ash更舒服,那就是在某些容器中,sh可能没有自动完成功能。给定的示例容器无法显示这一点。

自动完成意味着您可以写下某个内容的开头,然后按<Tab>将其作为全名。例如,当瞄准 时cd MY_FOLDERcd M+<Tab>就足够了,或者当您在另一个文件夹中打开文件并逐步添加子路径时。

据传闻,目前尚不清楚这种情况发生在哪个容器中。我也可能是一个过时的技巧,但是一些旧图像应该仍然存在于过时的版本中。

相关内容