在我们的培训课程改为长期课之后 (易生信培训改为长周期模式),大家学习、练习、理解宏基因组、扩增子、转录组、全基因组各个分析流程的时间也多了,每次直播都能提出很多代码使用的问题,更加促进了 代码的理解、培训知识的落地、应用于自己的分析。有时一次直播全用来回答最近一周练习时出现的问题,这是一个很好的形式。

其中提到有一个问题是:下面代码中的rm 为什么要写成/bin/rm?

大文件清理,高宿主含量样本可节约>90%空间

    /bin/rm -rf temp/qc/*contam* temp/qc/*unmatched*  temp/qc/*.fq
    ls -l temp/qc/

这是一个很好的问题,观察很仔细, 也带着了自己的思考。

rm是 Linux 下的一个危险命令,用于删除文件或文件夹,删除后很难恢复。程序员常做的删库跑路之一就是rm -rf /,在有权限的情况下递归删除服务器所有文件。

通常为了避免误删或使用方便,一般大家会在自己的~/.bashrc 或类似的文件中重定义一些命令,比如alias rm='rm -i'或复杂一些,  如下

function rm(){
 if [[ $# -lt 1 ]]; then
    echo "Usage: rm input"
    return 1
  fi
    /bin/mkdir -p ~/trash
    /bin/mv $@ ~/trash
}

所以,看上去同样写法的命令在不同的电脑上行为可能完全不一样。

我们自己在写脚本时要尽量保证代码适用于不同的电脑,所以这里我们用了复杂写法,直接指定用/bin 目录下的rm,看上去是麻烦了些,但好处是不受用户自定义行为的影响,更通用。类似的/bin/cp/bin/mv 也是常用的写法。