代码之家  ›  专栏  ›  技术社区  ›  Amro

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

  •  31
  • Amro  · 技术社区  · 15 年前

    考虑一下:

    cat file | command > file
    

    这是个好做法吗?这会在我们读取输入文件的同时覆盖它吗,或者它总是先在内存中读取,然后再通过管道传输到第二个命令?

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

    t=$(mktemp)
    cat file | command > ${t} && mv ${t} file
    
    3 回复  |  直到 8 年前
        1
  •  45
  •   Juliano    15 年前

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

    你需要 sponge(1) 从莫鲁蒂尔。

        2
  •  3
  •   Dimitre Radoulov    11 年前

    您还可以使用类似的内容(不推荐,在生产代码中使用显式临时文件):

    { rm file && your_command > file; } < file
    
        3
  •  0
  •   peak    10 年前

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

    在处理大文件时,我试过

        cat *allfastq30 > Sample_All_allfastq30
    

    并生成错误消息:

        cat: Sample_All_allfastq30: input file is output file