我使用的命令行应用程序实质上是bash shell脚本的集合。该应用程序被编写为可以在BSD / OSX和Linux上运行。其中一个脚本依赖于awk。它包含两个awk命令:一个是为nawk编写的(标准BSD awk实现),另一个是为gawk编写的(GNU awk实现)。
有问题的两个awk命令与不同的环境不兼容。特别是当与gawk一起运行时,nawk命令失败。该脚本检查内核名称(即uname -s
)以确定主机环境,然后运行适当的awk命令。但是,我更喜欢在安装了GNU核心实用程序的Mac OS X上工作,因此脚本无法正确运行。
在思考如何最好地修复此错误的过程中,我想到,很高兴知道如何以编程方式区分常见命令行实用程序的不同样式,最好以相对健壮和可移植的方式进行区分。
我注意到nawk不接受'-V'标志来打印版本信息,因此我认为应该执行以下操作:
awk -V &>/dev/null && echo gawk || echo nawk
另一个变化可能是:
awk -Wversion &>/dev/null && echo gawk || echo nawk
这似乎适用于我的两个测试环境(OS X和CentOS)。这是我的问题:
- 这是最好的方法吗?
- 有没有一种方法可以扩展它以处理awk的其他变体(例如,awkk,jawk等)?
- 甚至值得担心其他版本的awk吗?
我还应该提到我对awk知之甚少。
如果awk命令不是很复杂,即使不是那么复杂,您也可以考虑将其移植到perl或其他统一的东西中。
—
2015年
让我们通过
—
Costas 2015年
awk -Wv
主机环境而不是主机环境查看awk版本
我的awk很弱,但是我相信这很简单。我实际上已经用纯重的方式重写了它。但是,在这种情况下,我对满足好奇心比真正解决原始问题更感兴趣。
—
igal 2015年
@Costas实际上确实发生了这样的事情,但是我不确定它可能有多脆弱。我对awk知之甚少。我已将当前的解决方案添加到我的帖子中。
—
igal 2015年