何时编写可移植脚本很重要?

tox*_*lot 18 shell scripting bash portability

我编写的大多数代码都是用 PHP 编写的。我最近开始学习 shell 脚本。我遇到的大多数资源和教程都是针对 Bash 的。有些人对 bashisms 提出警告,有些人则没有。我在这里和 Stack Overflow 上读了很多。

每当答案使用bashisms 时总会有人评论说:

你不应该使用 <insert bashism here>。它不便携。

即使问题被标记为 ,也会发生这种情况bash。对我来说,这就像告诉 PHP 程序员他们不应该使用 PHP 5 中的新代码,因为它不能与 PHP 4 一起使用。或者告诉某人他们不应该为 Mac 编写一些东西,因为它不能使用在 Windows 上。

当我用 PHP 编写时,我会选择一个最低要求并编写向前兼容的代码。我不担心让它向后兼容。

如果我#!/bin/bash用作shebang,为什么不应该使用bashisms?我开始觉得有些人只是为了它而喜欢抨击bashisms(双关语)。

人们经常使用bashshell互换——可能是因为 bash 是许多系统上的默认 shell。所以我可以理解添加注释来警告代码使用 bashisms,但我不明白使用它们是错误的含义。

显然,如果我编写的脚本严格供个人使用,我可以用我想要的任何语言编写它。但我想我写的一些代码可能对其他人有用。

在发布之前,我尝试搜索我的问题的答案。我找到了很多关于如何测试可移植性的信息,但找不到任何关于何时这样做很重要的信息

那么,何时编写可移植脚本很重要?

例如,

  • 什么类型的脚本应该尽可能可移植?
  • 没有安装 Bash 的系统有多常见?
  • 如果系统安装了 Bash,它还会有 GNU 版本的find和其他实用程序吗?

jor*_*anm 15

作为这个社区的一员,我不经常看到人们因为针对 bash 的事情而无视 bashism。在谈论可移植性时,GNUisms 比 bashisms 糟糕得多。只要您bash用于您的shebang,您就可以期望脚本使用bash. 但是,除非您明确检查,否则您无法保证版本。Bash 版本 4 带来了一些有用的特性,例如关联数组,但 Bash v3 仍然广泛用于 OS X 和 RHEL 5。

什么类型的脚本应该尽可能可移植?

这更多地是关于您的需求以及您作为开发人员选择支持的内容。如果您正在为支持所有 *NIX 类型的应用程序编写安装脚本,那么可移植性将非常重要。

没有安装 Bash 的系统有多常见?

FreeBSD 和 Solaris 10 是默认情况下未安装 bash 的系统示例。大多数 Linux 系统都有它,嵌入式系统除外。

如果系统安装了 Bash,它还会有 GNU 版本的 find 和其他实用程序吗?

不,这是便携性的真正问题。如果可移植性很重要,您应该只使用由 POSIX 标准定义的 shell 命令功能。GNU 实用程序可以安装在非 GNU 系统上,例如 FreeBSD,但它们不太可能是 PATH 中的第一个,并且您不能依赖这些工具来安装。


use*_*082 5

那么,何时编写可移植脚本很重要?

什么类型的脚本应该尽可能可移植?

当您将它们用于您的工作环境,并且您在不同的机器上工作(或将来可能)时 - 并且,您不想在开始工作之前重写您的工具。

例如:垃圾脚本/rm替换


马克·斯图尔特:

...对于我的故障排除工具包,我假设我只有 vi 和 Korn shell。我尝试使用适用于大多数 Unix 版本的命令。

  • 我喜欢一些巧妙的“Bash-isms”,但对于我的故障排除工具包,我假设我只有 vi 和 Korn shell。我尝试使用适用于大多数 Unix 版本的命令。这样我就准备好在有问题的系统上进行分类,而不必担心 ps 命令的行为方式,无论是 Bash、Perl 还是 PHP,或者它们在哪里。 (3认同)