大家好,我是鸽无止境的草草哒。
好了好了,不用查族谱看我是哪位列祖列宗关注的简书作者了,总之今天我又发现了新的奇怪bug。
事情是这样的。
[站外图片上传中...(image-52c882-1599817028939)]
我正在测试一个船新的call SV的软件,叫做MUMandCo
,是一个以MUMmer
中nucmer
功能为基础编写的shell
脚本。在运行其测试数据时,我就光荣地报了错。
/PATH/mumandco_v2.4.sh: line 763: syntax error near unexpected token `('
当时我就万分疑惑,这可是软件的测试数据啊,怎么可能会跑不通呢?再一看,这软件半个月前还更新过,如果测试数据会报错肯定会有很多人反馈给开发者,不至于到现在还存在BUG。于是我把目光转向这诡异的第763行命令。
awk -F'\t' 'NR==FNR { dup[$0]; next; } $9 in dup' <(awk -F'\t' '{print $9}' $prefix.1000bp_invfilt_r_groups | sort | uniq -d) $prefix.1000bp_invfilt_r_groups > $prefix.1000bp_invfilt_r_groups2
最开始看到这行命令时,我下意识觉得它的小括号位置肯定存在错误。虽然我已经是一名熟练【并不x】的awk操作工,但我从来没见过用<
来将后续小括号中输出内容作为前方输入的写法。
于是我将出错的前置文件单独放了一个目录,然后用这行命令直接测试,结果是:没有报错!
难道说这行
awk
命令虽然看上去怪怪的,但其实是可以运行的,那么为什么在shell
脚本中会报错呢?我就这样在百思不得其解中思bai考du了半天,最后在一篇CSDN的文章中终于找到了靠谱的解释:就是这里
这篇文章中提到
sh
和bash
在执行程序时居然是不一样的!所以我去查了一下资料,发现:sh
(Bourne Shell)是一个早期的重要shell,1978年由史蒂夫·伯恩编写,并同Version 7 Unix一起发布。bash
(Bourne-Again Shell)是一个为GNU计划编写的Unix shell。1987年由布莱恩·福克斯创造。主要目标是与POSIX标准保持一致,同时兼顾对sh
的兼容,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。也就是说虽然我们查看服务器上
sh
命令时发现它链接到bash
,可它们并不是同样的!sh
对于命令符合POSIX
标准更加严格,而bash
兼容性更佳。这时,我看了一眼
MUMandCo
的示例程序,果然上面写的是bash
,是我在抄作业时图省事直接写成sh
,现在就是很后悔,非常后悔。