Bash:缓冲整个stdin,然后输出

时间:2014-06-10 22:18:27

标签: bash shell pipe

我需要使用不支持它的程序prog修改就地文件。

prog $file > $file.temp
cat $file.temp > $file
rm $file.temp

我想在没有临时文件的情况下一步完成此操作。这看起来不错,但不会起作用:

cat <(prog $1) > $1

如果我有办法缓冲管道内容(阻塞直到写入结束),工作,例如:

cat <(prog $1 | buffer_until_close) > $1

我该怎么做,或者用其他方式实现所需的语法?

1 个答案:

答案 0 :(得分:4)

  

如果我有一种缓冲管道内容的方法(阻塞直到写入结束),它会起作用,例如:

     

cat <(prog $1 | buffer_until_close) > $1

不,它不会。在任何程序启动之前,stdout>$1)的重定向是在之前执行的。一旦shell设置了重定向,它就会截断输出文件。

但是,正如评论中所提到的,sponge将起作用:

prog $1 | sponge $1
sponge包中找到

moreutils,大多数Linux发行版都会预先安装它。