好吧,所以我有点难住了。
我正在深入研究 BASH,目的是为我的雇主编写一些自动化脚本。另外,在这里全面披露:我是一名网络人员;到目前为止,我已经掌握了足够的 CLI 来操作 git。
我的问题是,大约一半员工使用 MacOS,另一半使用 GitBash,似乎支持不同的标志(或者,更相关的是,不是支持)在两个不同的 BASH 实例上。进一步的难题:随着每个人都在家工作以及世界末日等等,我无法可靠地要求我们的每一位员工“切换到发行版 X”/“升级到版本 Y”。
现在,我知道如何测试是否安装了给定的程序(不过,我承认:我不太清楚为什么一个程序比另一个程序更好,请纠正我,如果其中一个程序是处理这个问题的糟糕方法),形式如下:
type foo >/dev/null 2>&1 || { echo >&2 "COMMAND NOT FOUND"; }
...和...
[ -x "$(command -v foo)" ] || echo 'COMMAND NOT FOUND'
...但在我的具体情况下,两个平台都已foo
安装,但是,例如,只有 MacOS 有-b
/--bar
修饰符标志。那么,如何测试命令的给定功能是否受支持?每次我尝试将标志传递给其中一个测试时,执行测试的程序似乎认为它是针对 IT 的,完全忽略它,或者出错。
如何测试foo -b
/是否foo --bar
是有效/已安装/可访问的命令?
更新/答复
由于下面收到的合理且诚实的优秀答案中提出的普遍共识似乎是“不,一个人不能”的混合体,并被“有太多的因素能够可靠地收集任何类似于结论性的有用数据的东西”所打断。 ,我要结束这个问题了。
我在这里的目的是确定采用的正确方法是验证两个不同平台之间是否存在可能不存在的标志 -已知的幸运的是,就我而言,平台 - 在这种情况下,适当的策略似乎是我目前正在采取的策略:维护两个单独的脚本,每个平台一个。
感谢所有花时间回复的人!非常感谢。
答案1
以一种有用且可靠的方式,你可能做不到。您基本上需要单独测试每个命令以查看它的作用。 (命令“echo”是一个特别糟糕的例子。有很多变体。)
您可以做的是检查版本号和操作系统。
对于 BASH,请尝试
bash --version | head -1
或者
bash_version="$( bash --version | head -1|sed -e 's/.* version //;s/ .*//' )"
或者只使用预定义的符号$BASH_VERSION
对于操作系统来说,uname -s
这是一个好的开始,其他选项可能会为您提供更多详细信息。
一旦掌握了这些,您就可以开始根据需要编写条件代码。
话虽如此......对于您foo
可能采用或不采用--bar
选项的命令的具体情况:弄清楚这两个版本如何处理匹配的命令行,否则可以安全运行。例如,如果两个版本都foo
报告第一个无效选项,请尝试编写如下内容:
output="$( foo --bar --somethingtotallyinvalid 2>&1 )"
然后找出变量输出中的内容。当然,在这种情况下,它可能是有效的选项列表。如果是这样,您可以考虑:
output="$( foo --somethingtotallyinvalid 2>&1 | grep -e --bar )"