编写跨平台 shell 脚本的最佳方法是什么

Dav*_*ann 5 bash shell cross-platform

我有一个 shell 脚本,想在所有支持 bash 的多个平台上运行。我的问题是某些命令在 Linux、FreeBSD、OS X 和 Cygwin 上的行为不同。

到目前为止我的想法是:

  • 在主脚本中为所有特定于操作系统的操作创建函数的默认实现,然后检查$OSTYPE特定source于实现的文件(可选)替换行为不同的命令。如果我这样做,我应该如何处理带有多个参数的命令?传递给函数的四个位置参数并不是最简洁的方法。
  • 将所有实现放入我的脚本中,每个实现在名称中都有一个后缀,检查$OSTYPE并创建一个OPSUFFIX变量,然后调用operation$OPSUFFIX每个操作。
  • ./configure魔法?
  • 迁移到 Python 之类的东西——也许是最明智的,但需要最多的代码更改。如果这是一个惯用的初始化脚本,那么这不是一个选项。

Sam*_*man 1

首先,尽可能找到做你想做的事情的方法,而差异并不重要。例如,某些版本的 tar 过去不支持 -z 选项来处理 gzip 压缩文件。然而,结合 tar 和 gzip 是可移植的。类似地,调用 ps 的方法通常在 BSD 和 LINUX 上都有效。

一旦您发现仍有需要处理的事情,您寻找文件来提供处理命令语法的函数的方法似乎是合理的。为了避免位置参数,您可以使用 bash 内置的 getopt。

另一种方法可能是编写一个 python 脚本或类似脚本,仅封装最糟糕的平台相关命令行为。