关于cat特殊用法的一个小提示

最近在写一个bash脚本时遇到一个需求,即是:在特定文件的文件头部插入一条语句,当然使用bash内置的sed命令可以完美地实现这一功能,但是首先想到最简单实现这一功能的语句是:

1
echo "cd .." | cat vasp-input-path/runvasp.lsf > new_runvasp.lsf

简单解释一些这条命令的意义:将"cd …"这个语句通过管道传递给后面的cat语句,然后cat显示相应文件的内容,然后把这些文件内容一起写到new_runvasp.lsf文件中。逻辑上看起来是行得通的,但是实际操作的结果如下:
bsshcat
可以看到程序最终并没有按照预想的逻辑运行,"cd …"语句并没有插入到new_runvasp.lsf文件的开头。查阅资料后发现,如果在cat后加入一条短横线,却可以实现这一功能,即是:

1
echo "cd .." | cat - vasp-input-path/runvasp.lsf > new_runvasp.lsf

以下是测试结果:
bsshcat
产生这一现象的原因是,在Linux中短横线(-)可以表示输出流,由于管道的作用,前面echo命令向标准输出(stdout)写入,后面的cat命令从标准输入(stdin)读入,在cat后面加上短横线(-)后,cat可以接受输出流。