1

我通常用 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 样式的 init 脚本中。(它是否正确?)

底线:你不能总是在任何你喜欢的地方使用 bash,但 POSIX shell 可能已经存在。

4

2 回答 2

4

为什么你不知道你在哪个 shell 中运行你的脚本?

  • 您正在编写一个必须在未知机器上运行的安装程序脚本。
  • 您正在编写一个可以与多个已知 shell 一起工作的脚本。
  • bash即使在不同版本的bash(参见compat31, compat32, compat40,compat41选项)中,并非所有功能都相同。

不使用的一些常见示例bash

  • dash是 Debian 和 Ubuntu 的系统外壳
  • Mac OS X 继续提供bash3.2 而不是 4.x
  • Solaris 使用,我相信,一个版本ksh
  • bash需要在 FreeBSD 系统上单独安装。
于 2013-10-17T14:42:41.420 回答
1

这将是为了Bourne Shell本身的兼容性,以便脚本可以在仅具有任何(Bourne 兼容)shell 的基本机器sh任何其他机器上运行。显然,您这样做只是为了完全兼容

于 2013-10-17T13:53:19.323 回答