【问题标题】:Bash: buffer entire stdin, then outputBash:缓冲整个标准输入,然后输出
【发布时间】:2014-06-10 22:18:26
【问题描述】:

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

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

我想一步完成,没有临时文件。这看起来不错,但不起作用:

cat <(prog $1) > $1

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

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

我怎样才能做到这一点,或者以其他方式实现所需的语法?

【问题讨论】:

  • Sponge怎么样
  • 海绵应该在moreutils nowadays
  • 为什么讨厌临时文件?真的没有就地编辑文件这样的事情。似乎这样做的程序只是隐藏了创建临时文件并用它替换原始文件的细节。
  • 我不反对临时文件。我反对我自己的代码明确处理它们:) 这是表达问题,而不是过程问题

标签: bash shell pipe


【解决方案1】:

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

cat &lt;(prog $1 | buffer_until_close) &gt; $1

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

但是,如 cmets 中所述,sponge 将起作用:

prog $1 | sponge $1

sponge 位于 moreutils 包中,大多数 Linux 发行版都会预安装它。

【讨论】:

  • 谢谢!不仅是我要找的东西,也是宝贵的一课 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
  • 2011-05-03
  • 2013-11-28
相关资源
最近更新 更多