了解脚本需要的BASH版本

了解脚本需要的BASH版本,bash,shell,static-analysis,Bash,Shell,Static Analysis,我编写了一个shell脚本,它使用了一些特定于BASH的命令,例如[[…]]。我知道一些BASH功能只在Bash4或更高版本中可用。如何在不尝试大量不同版本的情况下找出此脚本所需的BASH版本 是否有某种工具可以检查所需的最低版本 源代码可在GitHub上获得,网址为,这里有大量参考资料可供查阅:a)特定Bash功能的介绍,b)Bash的一般功能: (“是否有向特定版本(Bash版本)添加了哪些功能的列表?”) 关于Bash黑客 这些都可以用来确定何时引入了功能 对于Bash主义列表,Ba

我编写了一个shell脚本,它使用了一些特定于BASH的命令,例如
[[…]]
。我知道一些BASH功能只在Bash4或更高版本中可用。如何在不尝试大量不同版本的情况下找出此脚本所需的BASH版本

是否有某种工具可以检查所需的最低版本


源代码可在GitHub上获得,网址为

,这里有大量参考资料可供查阅:a)特定Bash功能的介绍,b)Bash的一般功能:

  • (“是否有向特定版本(Bash版本)添加了哪些功能的列表?”)
  • 关于Bash黑客
这些都可以用来确定何时引入了功能

对于Bash主义列表,Bash手册在(“与Bourne Shell的主要差异”)中描述了与Bourne Shell的差异,Wooledge wiki上有一篇文章

我不知道“在野外”的版本分布是什么,但如果您的用户群包括macOS用户,请注意他们使用Bash 3.2,除非他们使用自制或类似软件进行升级


至于以编程方式确定运行特定脚本所需的Bash版本,我不知道有任何工具可以做到这一点。在某种程度上,当脚本以
#开头时,它可以警告bashism/bin/sh

您所要求的无法完成。这是一个基本上不可能解决的编程问题。一个(但不是唯一的)原因是,脚本可能在运行时构造字符串并对其求值,而您无法通过自动方式分析任意程序将生成的数据。

不用麻烦了。使用脚本。如果/当您的一个用户报告旧版本出现问题时,那么就开始担心它,此时您至少知道所需版本的一个下限。@williampersell:我实际上想避免这种情况。然后编写一个可移植的shell脚本,完全避免bashism。不要半途而废。如果您要编写不可移植的代码,那么就期望它对某些用户组会中断。尝试版本匹配是一个毫无意义的练习。@williampersell,谢谢,但这并不能回答我的问题:如何找到我已经完成的脚本所需的版本have@mfnalex我懂了。bash本身和bash调用的外部命令之间有区别。据我所知,您在该脚本中使用的唯一特定于bash的特性是数组语法。你最好还是坚持下去。。。将其转换为POSIX sh需要在函数中使用
$@
、动态生成变量名或使用临时文件。至于外部命令,如果希望脚本作为一个整体是可移植的,则必须小心使用哪些命令以及如何使用这些命令。这里有一个可能的
shuf
替代品谢谢,我在macOS上用Bash3.2试用了我的新版本,在安装了coreutils并创建了从/usr/local/bin/shuf到/usr/local/bin/gshuf的符号链接之后,一切正常。因此,我应该安全地声明它至少与Bash3.2+兼容。我将浏览3.2之前的变更列表,并尝试是否能找到与我使用的表达式/函数相关的内容。