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