Bash:缓冲整个标准输入,然后输出

sle*_*ica 4 bash shell pipe

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

prog $file > $file.temp
cat $file.temp > $file
rm $file.temp
Run Code Online (Sandbox Code Playgroud)

我想一步完成此操作,无需临时文件。这看起来不错,但行不通:

cat <(prog $1) > $1
Run Code Online (Sandbox Code Playgroud)

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

cat <(prog $1 | buffer_until_close) > $1
Run Code Online (Sandbox Code Playgroud)

我该如何做到这一点,或者以其他方式实现所需的语法?

ric*_*ici 5

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

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

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

然而,正如评论中提到的,sponge将会起作用:

prog $1 | sponge $1
Run Code Online (Sandbox Code Playgroud)

sponge可以在moreutils软件包中找到,并且大多数 Linux 发行版都会预安装它。