考虑类似的事情:
cat file | command > file
这是好习惯吗?这可能会在我们读取输入文件的同时覆盖输入文件,还是始终先在内存中读取然后通过管道传输到第二个命令?
显然,我可以使用临时文件作为中间步骤,但我只是想知道..
t=$(mktemp)
cat file | command > ${t} && mv ${t} file
答案 0 :(得分:46)
不,不行。管道中的所有命令同时执行,并且shell在执行命令之前准备重定向。因此,在cat读取之前,该命令很可能会覆盖该文件。
您需要来自moreutils的sponge(1)。
答案 1 :(得分:3)
你也可以使用这样的东西(不推荐,在生产代码中使用显式临时文件):
{ rm file && your_command > file; } < file
答案 2 :(得分:0)
您不仅不应该将输出写入输入,还应该避免将输出循环回输入。
在处理大文件时,我试过
cat *allfastq30 > Sample_All_allfastq30
并生成错误消息:
cat: Sample_All_allfastq30: input file is output file