我通常用 bash 编写脚本。我告诉其他人在 bash 中运行它们,并且我使用 #!/usr/bin/env bash
作为 shebang 行。
当我阅读有关 shell 脚本的文章时,我经常发现评论中包含不使用“bashisms”的“可移植”解决方案的建议。可移植的 shell 脚本似乎是可以在任何 Bourne Shell 衍生产品中运行的脚本,例如。 bash、ksh 或 csh。
对我来说这似乎有点奇怪。为什么您不知道在哪个 shell 中运行脚本?所以我的问题是:可移植 shell 脚本的实际用途是什么?如果您想使用 bash 功能,为什么不直接使用 bash?
我认为需要可移植性的情况很常见,否则为什么会经常提到它?也许某些环境出于历史原因需要可移植性——我不知道——但我有兴趣找出这些环境是什么。
提前致谢!
编辑:
我从您的回答和评论中得出的结论(谢谢!):
- 您可能需要避免使用较新的 bash 功能,因为它们可能并非在所有 bash 版本中都可用,而且某些计算机会安装旧版本。
- 安装程序脚本应该可以在不受您控制的计算机上运行。并非所有类 Unix 操作系统都默认带有 bash。相反,POSIX shell 几乎是普遍可用的,因此它提供了比 bash 更好的覆盖范围。
- 您可能需要在 1000 台计算机上运行脚本,但您不想(或不能)在所有地方安装 bash。 POSIX shell 可能可用。
- 您甚至可能无法在您喜欢的计算机上安装 bash。例如,这可能是由于缺少管理权限、缺少平台的 bash 包或缺少“基本”计算机中的资源。同样,POSIX shell 可能可用。
- 在某些环境中,您不能将 shell 假定为 POSIX shell,例如在 System V 样式的初始化脚本中。 (这是正确的吗?)
底线:您不能总是在任何您喜欢的地方使用 bash,但 POSIX shell 可能已经存在。
最佳答案
Why would you not know what shell you run your script in?
- 您正在编写必须在未知机器上运行的安装程序脚本。
- 您正在编写一个可用于多个已知 shell 的脚本。
- 即使在不同版本的
bash
中,并非所有bash
功能都相同(参见compat31
、compat32
,compat40
,compat41
选项)。
非bash
用法的一些常见示例:
dash
是 Debian 和 Ubuntu 的系统 shell- Mac OS X 继续附带
bash
3.2 而不是 4.x - 我相信,Solaris 使用
ksh
的一个版本
bash
需要在 FreeBSD 系统上单独安装。
关于bash - 可移植的 shell 脚本有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19428418/