是否可以使用相同的输入文件作为管道命令的输出?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以使用相同的输入文件作为管道命令的输出?相关的知识,希望对你有一定的参考价值。

考虑类似的事情:

cat file | command > file

这是好习惯吗?这可能会在我们读取输入文件的同时覆盖输入文件,还是始终先在内存中读取然后通过管道传输到第二个命令?

显然,我可以使用临时文件作为中间步骤,但我只是想知道..

t=$(mktemp)
cat file | command > ${t} && mv ${t} file
答案

不,不行。管道中的所有命令同时执行,shell在执行命令之前准备重定向。因此,在cat读取之前,该命令很可能会覆盖该文件。

你需要来自moreutils的sponge(1)

另一答案

你也可以使用这样的东西(不推荐,在生产代码中使用显式临时文件):

{ rm file && your_command > file; } < file
另一答案

您不仅不应将输出写入输入,还应避免将输出循环回输入。

在处理大文件时,我试过了

    cat *allfastq30 > Sample_All_allfastq30

它生成了错误消息:

    cat: Sample_All_allfastq30: input file is output file

以上是关于是否可以使用相同的输入文件作为管道命令的输出?的主要内容,如果未能解决你的问题,请参考以下文章

管道符重定向与环境变量

linux文件命令2

是否可以从管道中的 sh DSL 命令捕获标准输出

杀死相同进程名

shelll编程之xargs命令:上一个命令输出作为下一个命令的输入

linux下xargs和管道的区别