什么不是特定于 shell 的?

mus*_*usa 9 linux command-line shell standard shell-builtin

在一些答案下,我看到建议避免在答案中使用特定于 shell 的命令的评论。

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

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

Sha*_*off 12

Greg 的 Wiki有一篇关于为 Dash 调整 bash 脚本帖子,其中指出了许多“bashisms”——非标准但属于 bash 一部分的额外功能。避免这些 bashism 有助于使您的脚本对不同的环境更友好。这特别回答了您的一些问题。例如,是的,有一些不同的运算符(如==),但有一个标准 Posix 集应该适用于所有环境。

如需更深入的阅读,您可以查看Posix 标准,所有 shell 都应遵守该标准。特别是关于“Shell & Utilities”的卷。

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

有关良好的 shell 脚本编写实践的额外阅读,David Pashley 的博客上还有一个很好的资源:Writing Robust Bash Shell Scripts

另外,请确保您阅读了本网站上的Gilles回答和评论。他有很多关于确保您使用可移植代码的技巧。


Sar*_*use 5

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

然而,大多数 Unix 命令在不同的实现下有不同的语法——看看在psSolaris、FreeBSD 和 GNU 下——所以根据你使用的工具,你的脚本可能无论如何都不是可移植的。shell 的安装位置也很重要。是/bin/bash /usr/bin/bash, /usr/local/bin/bash, 还是其他地方?

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

  • POSIX 定义了 sh。 (7认同)