将 sh 与 bash 结合使用

将 sh 与 bash 结合使用

我使用的是 ubuntu 操作系统,我的默认 shell 是 bash。但是,我仍然可以使用 Bourne shell (sh) 编写 shell 脚本,方法是包括:

# !/bin/sh 

为什么我使用 bash 时仍可以使用 sh?这是因为 bash 是 Bourne shell 的改进版,因此它向后兼容 sh 吗?

答案1

就像现在的 Debian 一样,shUbuntu 中实际上是一个指向 Dash 的符号链接。你可以使用以下命令进行检查ls -l

pg1@TREX:~$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Dec 10  2020 /bin/sh -> dash

“改进”这个词不太准确;Bash 更像是 Bourne shell 的扩展版本。Dash 不兼容 Bash,但 Bash 尽量保持与 POSIX 的大部分兼容;因此与 Dash 兼容。注意,大部分——你时不时会看到这个词巴什主义用于脚本中不符合 POSIX 标准的元素。

引自 LWN.net 文章两种 Shell 的故事:bash 或 dash

“切换默认 shell 的主要原因是效率。bash 是一款出色的全功能 shell,适合交互式使用;事实上,它仍然是默认的登录 shell。但是,与 dash 相比,它相当庞大,启动和运行速度较慢。大量的 shell 实例是作为 Ubuntu 启动过程的一部分启动的。Ubuntu 核心开发团队认为,最好只是更改默认 shell,而不是将它们逐个更改为在 /bin/dash 下明确运行,这种更改需要大量的持续维护,如果不密切关注,可能会出现倒退。

Debian EeePC 项目还指出 dash 提供了更快的启动时间。”

答案2

舍邦告诉您的 shell(在本例中为 bash)用什么来执行文件的剩余部分。您可以用它做一些棘手的事情,但我不会在这里讨论这些。

它不会告诉 bash 采取不同的行为。例如,如果它指向/usr/bin/perl,perl 将尝试执行该文件。

@Peregrino69 的回答包含一些关于Ubuntush实际操作dash的有用信息。我强烈建议您也阅读一下。

当你有这#!/bin/sh行代码时,它下面的所有内容确实会用 sh 而不是 bash 执行。这就是为什么 POSIX 操作系统(大多数)不需要文件扩展名(Windows)或资源分支(经典 mac)。
这种行为既有好处也有坏处。例如,它只支持硬编码路径名,如果whizbangOSLinux++把 sh 放进去/usr/bin/sh

我相信 shebang 可以用来执行几乎任何东西,包括 ASCII 后面的二进制数据,但我已经好几年没见过这种伎俩了,也不知道它是否仍然受支持。

相关内容