什么不是特定于外壳的?


9

在某些答案下,我看到一些建议不要在答案中使用特定于Shell的命令的注释。

我如何知道所有shell中都存在哪些命令,运算符等?有标准清单吗?

  • man builtins给出命令列表。这些是我可以在所有shell中都能使用的可移植shell脚本中唯一使用的命令吗?
  • 内置可以是特定于外壳的吗?
  • Linux的标准是否与其他Unix的标准不同?
  • 语法呢?标点符号,运算符等在某些shell中可以不同吗?

Answers:


12

Greg的Wiki上有一篇关于为Dash修改bash脚本文章,指出了很多“ bashisms”-非标准的但是bash一部分的额外功能。避免这些卑鄙的行为可以使您的脚本更适合不同的环境。这尤其可以回答您的一些问题。例如,是的,有些运算符有所不同(例如==),但是有一个标准的Posix集应该在所有环境中都可以工作。

要更全面地阅读,您可以查看Posix标准,所有外壳都应遵守该标准。特别是“ Shell&Utilities”上的卷。

我发现比shell差异更具挑战性的是命令差异。许多Linux系统都具有GNU find,但是如果您正在编写可移植的脚本,请不要依赖于您自己的脚本,man find因为那里有很多带有BSD的系统,而BSD find具有不同的功能集。如果您正在为busybox编写脚本,则会发现有完全不同的ncs的不同版本。当我将脚本部署到不同的环境时,这些总是会让我受益的。

要获得有关良好的Shell脚本编写实践的更多信息,David Pashley的博客上也提供了很好的资源:编写强大的Bash Shell脚本

另外,请确保您已在本网站上阅读了Gilles的答案和评论。他提供了许多有关确保您使用可移植代码的提示。


5

在特定的外壳程序中编写外壳程序脚本意味着已安装该外壳程序。唯一的标准是拥有cshsh安装在所有Unix变体上。因此,如果您希望脚本在Solaris,* BSD和GNU上运行,则必须将其编写在Bourne shell中。

但是,大多数Unix命令在不同的实现方式下具有不同的语法(ps在Solaris,FreeBSD和GNU下进行查看),因此,根据所使用的工具,脚本可能始终无法移植。安装外壳的位置也很重要。难道/bin/bash /usr/bin/bash/usr/local/bin/bash或别的地方?

我不知道任何定义外壳的标准。看一下rc或http://192.220.96.201/es/es-usenix-winter93.html`es上的怪异的非标准外壳,但是,这些外壳似乎仍然符合一些常见的想法。


7
POSIX定义sh。
Random832
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.