便携式shell脚本有什么用?

时间:2013-10-17 13:43:05

标签: bash shell scripting portability

我通常用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可能已经存在。

2 个答案:

答案 0 :(得分:4)

  

为什么你不知道你运行脚本的shell是什么?

  • 您正在编写必须在未知计算机上运行的安装程序脚本。
  • 您正在编写一个可以处理多个已知shell的脚本。
  • 即使在bash的不同版本中,并非所有bash功能都能正常工作(请参阅compat31compat32compat40compat41选项)。

bash用法的一些常见示例:

  • dash是Debian和Ubuntu的系统shell
  • Mac OS X继续附带bash 3.2而不是4.x
  • 我认为Solaris使用ksh
  • 的版本
  • bash需要在FreeBSD系统上单独安装。

答案 1 :(得分:1)

这将是 Bourne Shell 兼容性本身,因此脚本可以在只有sh任何其他的简单机器上运行具有任何(Bourne兼容)shell的计算机。您显然执行此操作以获得完整且完整的兼容性