bash - 可移植的 shell 脚本有什么用?

标签 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 样式的初始化脚本中。 (这是正确的吗?)

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

最佳答案

Why would you not know what shell you run your script in?

  • 您正在编写必须在未知机器上运行的安装程序脚本。
  • 您正在编写一个可用于多个已知 shell 的脚本。
  • 即使在不同版本的 bash 中,并非所有 bash 功能都相同(参见 compat31compat32 , 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/

相关文章:

c - shell在即将关闭时发出什么信号

programming-languages - 脚本语言和其他语言有什么区别

linux - 发送电子邮件的 Shell 脚本

Bash - stdir 单词到文件

ruby-on-rails - rake 任务在另一个项目中执行 bundle 安装

linux - diff 命令不工作 "missing operand after ` diff'"

linux - 如果 Linux 进程失败或崩溃,自动重新启动它

Bash:如何区分符号字符和变量名称?

linux - 如果找到关键字,则删除定界符之间的模式

python - 我怎样才能让 Python 程序使用通过模块 sys 运行的命令来杀死自己?