Linux 从脚本内部确定解释器

Linux 从脚本内部确定解释器,linux,bash,interpreter,Linux,Bash,Interpreter,我有剧本;它需要使用bash的关联数组(相信我) 它需要在普通机器上运行,以及在具有/bin/bash3.2的特定附加机器上运行 如果我将解释器声明为/opt/userwriteablefolder/bin/bash4,也就是我放在那里的bash4.2的位置,它就可以正常工作。。但它只能在那台机器上工作 我希望在脚本开始时进行测试,检查解释shell是什么,如果是bash3.2,则调用bash4$0$@。问题是我无法找出任何方法来确定解释shell是什么。我真的不想做一个基于$HOSTNAME的

我有剧本;它需要使用bash的关联数组(相信我)

它需要在普通机器上运行,以及在具有/bin/bash3.2的特定附加机器上运行

如果我将解释器声明为
/opt/userwriteablefolder/bin/bash4
,也就是我放在那里的bash4.2的位置,它就可以正常工作。。但它只能在那台机器上工作

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


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

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

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

  • ${BASH_VERSINFO[*]}
    --版本组件数组,例如
    (4.1.5.1版本x86_64-pc-linux-gnu)
  • ${BASH_VERSION}
    --字符串版本,例如
    4.1.5(1)-发行版
  • 当然,
    “$0”--版本

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

  • 将bash 4.2安装为
    /opt/userwriteablefolder/bin/bash
  • 使用“#”/usr/bin/env bash'作为脚本中的shebang
  • 将“/opt/userwriteablefolder/bin”添加到所处环境的
    PATH
    前面 您的脚本将被调用,因此将使用
    bash
    如果存在,否则 将使用常规的
    bash

  • 这样做的好处是不必在运行时检测bash的版本,但我意识到您的设置可能不符合第3步的要求。

    我无法使
    $0--version
    工作,但
    $bash\u version
    存在。尽管不在
    printenv
    中。我去寻找那个。我不喜欢
    printenv
    看不到的环境变量…@zebediah49它是一个shell变量,而不是一个环境变量。e、 g.您可以设置
    foo=bar
    ,除非您
    export foo
    ,否则它不会出现在
    printenv
    中。FWIW如果用户使用不同的登录shell,但仍在运行bash脚本,则此操作不起作用。有关shell的备注完全错误<代码>SHELL与运行脚本的SHELL完全无关。这就像说“EDITOR是正在运行的编辑器的完整路径”或“PAGER是less的完整路径”。SHELL环境变量表示用户喜欢的SHELL,仅此而已。@ephemient:
    SHELL
    变量非常无用,除非您已经设置了SHELL配置以正确设置此变量。当我在zsh shell中运行bash子shell时,
    shell
    仍然设置为zsh,反之亦然。对于bah来说,
    BASH_版本
    似乎是可靠的。这实际上有一点好处,尽管它使它更依赖于用户。因此,进行实际版本检查。