从内部脚本确定解释器

zeb*_*h49 4 linux bash interpreter

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

它需要在普通机器上运行,以及某个具有/ bin/bash 3.2的附加机器.

如果我声明解释器是/opt/userwriteablefolder/bin/bash4,我放在那里的bash 4.2的位置,它工作正常..但它只适用于该机器.

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

出于几个原因,"只有两个脚本"并不是一个好的解决方案.

eph*_*ent 5

您可以通过查看来查看使用的解释器$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

  • @ zebediah49这是一个shell变量,而不是一个环境变量.例如,你可以设置`foo = bar`,除非你'导出foo`,否则它不会在`printenv`中. (2认同)
  • 如果用户使用不同的登录shell但仍然运行bash脚本,那么这不会起作用. (2认同)