是否可以更换破折号之类的外壳?

是否可以更换破折号之类的外壳?

我正在致力于基于 Debian 构建我自己的 Linux 发行版。我很好奇是否可以完全删除破折号并将其替换为像鱼或精灵一样的贝壳。我知道您需要进行一些更改,但我很好奇是否可能以及您需要采取的流程。

答案1

没有什么可以阻止您安装额外的 shell,但如果我们谈论的是通用的类 Unix 系统,例如 Debian,您需要确保您的系统有一个/bin/sh支持 POSIXsh语法的 shell。例如,许多编程语言都使用该 shellsystem("some sh code")来解释没有 shebang 的脚本(当然还有所有带有#! /bin/sh -shebang 的脚本)。

不一定是dash,也可以是bashksh88² ,mksh, ,boshposh,甚至zsh³ ,其sh模式可能足够好。fish, elvish, csh, tcsh, rc,es是 shell 的示例,其语法与 POSIX 的语法完全不同sh,因此不能在sh那里使用。

其中,dash可能是最好的选择,因为它比大多数其他选择更精简、更快、更安全,您需要它做的就是解释 POSIX sh 代码。它也是 Debian 及其大多数衍生产品使用的 shell,因此作为sh解释器拥有最大的用户群之一,这意味着如果有任何问题通常都会被快速发现并修复。

至少,在类似 Debian 的系统中情况要好一些。在其他一些基于 GNU 的系统上,/bin/sh必须是bash( 的 GNU 实现sh),因为某些系统脚本使用该 shell 的某些非标准扩展。 Debian 付出了巨大的努力来删除所有那些所谓的巴什主义所以bash可以用更精简/更快的 shell 替换,例如dash它的/bin/sh.

无论如何,只要直接在内核中实现系统的功能,就可以让系统在没有任何 shell、或者没有任何命令甚至文件系统的情况下完美工作,因此,严格来说,答案是只要您准备好从头开始构建自己的系统,这种问题就永远是肯定的。


严格来说,对于 Debian,shell 必须符合 Debian 政策,Debian 政策是 POSIX 的超集。在必须支持的其他内容中,sh有一个local关键字/内置函数可以获取函数中变量的局部作用域。

² 这是 POSIX 规范所基于的 shell(其子集)sh,但它从未作为 FLOSS 发布,因此您将很难找到它的 GNU/Linux 版本。

³ 虽然yash是另一个符合 POSIX 标准的 shell,但我会避免使用它,因为它通常无法处理非文本数据。 busybox ash 也主要兼容 POSIX,但请注意,根据 busybox 的构建方式,它可能会调用 busybox 小程序而不是相应的系统命令,其中一些不兼容 POSIX,因此会破坏需要完整 POSIX 功能集的脚本。 ksh93 主要兼容 POSIX,但不支持localDebian 策略的要求。也可以看看支持“local”关键字定义局部变量的 shell 列表

相关内容