sh与bash并不是一样的,抄作业时请对着抄

2020-09-11  本文已影响0人  腐草为嘤

    大家好,我是鸽无止境的草草哒。
    好了好了,不用查族谱看我是哪位列祖列宗关注的简书作者了,总之今天我又发现了新的奇怪bug。


    事情是这样的。
[站外图片上传中...(image-52c882-1599817028939)]
    我正在测试一个船新的call SV的软件,叫做MUMandCo,是一个以MUMmernucmer功能为基础编写的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操作工,但我从来没见过用<来将后续小括号中输出内容作为前方输入的写法。
    于是我将出错的前置文件单独放了一个目录,然后用这行命令直接测试,结果是:没有报错!

WTF?!!!
    难道说这行awk命令虽然看上去怪怪的,但其实是可以运行的,那么为什么在shell脚本中会报错呢?
    我就这样在百思不得其解中思bai考du了半天,最后在一篇CSDN的文章中终于找到了靠谱的解释:就是这里
    这篇文章中提到shbash在执行程序时居然是不一样的!所以我去查了一下资料,发现:
    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,现在就是很后悔,非常后悔。
上一篇下一篇

猜你喜欢

热点阅读