5

我有一个脚本;它需要使用 bash 的关联数组(相信我)。

它需要在普通机器上运行,也需要在具有 /bin/bash 3.2 的某些附加机器上运行。

如果我将解释器声明/opt/userwriteablefolder/bin/bash4为 bash 4.2 的位置,则它工作正常。但它只能在该机器上工作。

我想在脚本的开头进行测试,检查解释 shell 是什么,如果是 bash3.2,则调用bash4 $0 $@. 问题是我想不出任何方法来确定解释 shell 是什么。我真的宁愿不做一个基于 $HOSTNAME 的决定,但如果有必要,它会起作用(这也很尴尬,因为它需要传递一个“我们已经完成这个”标志)。

出于几个原因,“只有两个脚本”不是一个好的解决方案。

4

2 回答 2

2

您可以通过查看来检查使用了哪个解释器$SHELL,其中包含 shell 可执行文件的完整路径(例如/bin/bash

然后,如果是 Bash,可以通过各种方式查看 Bash 版本:

  • ${BASH_VERSINFO[*]}-- 一个版本组件数组,例如(4 1 5 1 release x86_64-pc-linux-gnu)
  • ${BASH_VERSION}-- 一个字符串版本,例如4.1.5(1)-release
  • 而且当然,"$0" --version
于 2012-07-28T00:03:44.150 回答
2

这可能是一个选项,具体取决于您启动脚本的方式:

  1. 将 bash 4.2 安装为/opt/userwriteablefolder/bin/bash.
  2. 使用 '#!/usr/bin/env bash' 作为脚本中的 shebang。
  3. PATH在调用脚本的环境中将“/opt/userwriteablefolder/bin”添加到前面,这样bash如果存在就会使用,否则bash将使用常规。

这样做的好处是避免在运行时检测 bash 的版本,但我意识到您的设置可能不会使第 3 步变得可取。

于 2012-07-28T00:21:39.677 回答