Bash:可以使用相同的input文件作为pipe道命令的输出吗?

考虑这样的事情:

cat file | command > file 

这是好的做法吗? 这可能会覆盖input文件,因为我们正在阅读它,或者它总是先读取内存然后pipe道到第二个命令?

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

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

Solutions Collecting From Web of "Bash:可以使用相同的input文件作为pipe道命令的输出吗?"

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

你需要海绵(1) moreutils。

你也可以使用类似的东西(不建议,在生产代码中使用显式的临时文件):

 { rm file && your_command > file; } < file 

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

当处理大文件时,我试了一下

  cat *allfastq30 > Sample_All_allfastq30 

并生成错误消息:

  cat: Sample_All_allfastq30: input file is output file