所以,Linux 中有很多类型的 shell...
Linux 中不同类型的 Shell
Bourne Shell (sh) ...
GNU Bourne-Again Shell (bash) ...
C Shell (csh) ...
Korn Shell (ksh) ...
Z Shell (zsh)
我有一个项目,我必须为 Bourne shell 编写一个脚本,从 shebang 开始#!/bin/sh
。
但每当我使用谷歌来了解一些细节时,我总是会得到大量的结果bash
,我怀疑可以与它一起使用sh
, 但不总是...
所以我想告诉 Google,“不!只提供原始 Bourne shell 的东西!”。但人们不会在大多数网页中输入字符串“Bourne shell”,因此 Google 无法直接帮助我解决此问题。
添加"sh"
对我的搜索查询没有多大帮助,它匹配.sh
文件扩展名,并且匹配bash
!
添加"#!/bin/sh"
我的搜索查询是有些有帮助 - 但我只会在脚本中看到结果,有时简单的答案会显示为终端命令(然后我们可以调整以在脚本中使用)。
我知道不会有任何“银弹”完美的解决方案,但本着“提示和技巧”的精神,你们中的任何人会建议聪明的方法来缩小我的结果范围,就像我想要的那样吗?
或者是使用少数权威 Bourne shell 文档源的唯一解决方案?如果有,是哪些?
答案1
您很可能实际上对历史上的 Bourne shell(大多数当前的 UNIX 系统上并不常见)感兴趣,而是对实现当前的 POSIX 规范对于sh
外壳。
- 该实用程序的 POSIX 标准
sh
可在描述该实用程序的部分中找到,sh - shell,标准命令语言解释器, 和 - POSIX shell的语法、文法等在 章节中有描述外壳命令语言。
也可以看看:
目前接受的答案关于 U&L 问题“sh 兼容”是什么意思?详细描述了 Unix shell 的历史和“谱系”。
您正在使用的系统上的命令将显示该系统上 shell
man sh
的手册。sh
这将是一个实现 POSIX 语法和语法的 shell,可能通过更改 shell 的方式来实现通常情况下如果使用自己的名称调用,则会表现出行为(例如,当调用为 时,会执行bash
和操作)。zsh
sh
答案2
根据我的经验,如果您正在寻求有关如何使用#!/bin/sh
shell 执行特定操作的帮助,您可以在 Google 查询前面添加以下内容之一:
POSIX- 它将引导您讨论如何在 POSIX 兼容 shell 中实现给定功能,或在 shell 中以 POSIX 兼容方式实现更多 POSIX 不需要的功能,例如 Bash。 (通常你最终会在 https://unix.stackexchange.com)
短跑- dash 是 /bin/sh Ubuntu,它是最流行的桌面 Linux 发行版。它由 cron 和其他使用 /bin/sh 运行命令的工具使用,因此已经提出并回答了很多问题
忙碌盒- busybox 带有自己的 shell,它不像 Bash 或 ZSH 那么大,所以如果某些东西在 busybox shell 中工作,它也应该与您本地的极简 /bin/sh 一起工作,无论它是什么。
答案3
我想说的是解决这个问题的最佳方法:
常识
虽然这听起来很明显或粗鲁,但您可能会问“什么常识?”:
bash
sh
有时在某些发行版上有符号链接sh
有时是ash
(busybox)的符号链接bash
脚本通常在 下工作正常(某些语法除外)sh
,反之亦然(与ash
-相同sh
)- 尝试一下。 (从字面上看,因为任何片段是否有错误可能并不明显,除非您使用
shellcheck
或有更多经验) - 尝试不同的关键字组合(这是显而易见的,但在不使这篇文章更长的情况下更难详细解释)
- 尝试不同的搜索引擎(大多数都有相似的结果,但并非总是如此,如果有的话)精确的相同的结果,相同的关键字)
您也可以将上述内容应用于其他 shell。只要毫不犹豫地使用try
您找到的任何片段/代码(我找到-x
或set -x
用于调试并shellcheck
在执行此操作时提供有用的帮助)。
当然,当您有疑问或偶然发现问题时,仍然建议您使用每个 shell 的相关文档。
其他资源:
- http://mywiki.wooledge.org/BashFAQ
- https://github.com/dylanaraps/pure-bash-bible
- https://github.com/dylanaraps/pure-sh-bible
- https://www.gnu.org/software/
- https://wiki.bash-hackers.org/
尝试是学习的一部分。祝你好运!
答案4
在常见的 Linux 发行版中,我认为大多数(例如 CentOS 和 Arch)都使用 Bash 作为/bin/sh
.主要的例外是 Debian 和 Ubuntu(及其衍生版本),它们使用 Dash。 Ubuntu 还有一个有用的 wiki 页面,标识了最常见的“Bashisms”:https://wiki.ubuntu.com/DashAsBinSh
请注意,原来的Bourne shell 与 Dash 等实现的 POSIX shell 略有不同。如果不明确查找,您将无法在 Linux 系统上找到它,例如传家宝贝壳。