【问题标题】:Differences between sponge and tee海绵和三通的区别
【发布时间】:2016-02-11 20:00:14
【问题描述】:

在做一些工作时,我发现这个“海绵”命令与“tee”的作用相同,但找不到什么时候最好使用其中一个。

谁能解释一下?

【问题讨论】:

  • 在我触手可及的任何 Linux 上,都没有 soak 命令。只有tee。直到现在我都没有听说过前者。你的意思是sponge 吗?
  • 你指的是“海绵”命令吗? “海绵 - 吸收标准输入并写入文件”
  • 我编辑了我的问题。 @Two-BitAlchemist 是的。是海绵
  • 好的。我想补充一点,以防我没有说清楚:tee 将出现在您发现的 99.99% 的 Linux 安装中。这个sponge 需要专门安装,甚至可能不适用于某些发行版(我不知道)。无论如何,不​​要指望它只是可用。如果您正在编写打算分发的 shell 脚本,这一点尤其重要。
  • 对于任何想要安装sponge的人:在Debian上apt-get install moreutils

标签: linux


【解决方案1】:

没有人吸收stderr;只有标准输出。 'tee' 将 stdin 写入 stdout 和文件。 'sponge' 仅将 stdin 写入文件;没有错误,没有输出。 (即:与 'tee' 不同,'sponge' 不在 stdout 上书写)。 此外,

“海绵在打开输出文件之前吸收所有输入”

(来自其手册)

他们之间的这个区别是非常相关的:'tee'“读取一个字节”和“写入那个字节”; 'sponge' 等待接收所有输入,然后写入。

【讨论】:

  • 任何特定的用例为什么可以使用sponge 而不是tee?我猜一般流媒体是好的。我知道排序需要完整的输入,但什么是示例命令?
  • expand foo.txt | sponge foo.txt,另见:unix.stackexchange.com/q/207919/43390
  • 只是添加另一个用例:当使用写入文件并可能阻塞的自动化脚本时,这些文件将无限期地打开其文件描述符。在使用 cron 时,这尤其是一个问题。见:wiki.archlinux.org/index.php/Cron#Long_cron_job
【解决方案2】:

实际上,如果您进行迭代处理,则会有很大的不同; 由于 tee 将逐字节读取,因此如果您的源文件也是目标文件,您可能会因为 instisfatory 重定向而得到空白文件。 Sponge,将在开始写入打开的文件之前读取所有输入。

tee 不会产生所需的输出

tf=/tmp/simple
jq -n '.name="Doe"' > $tf
cat $tf
> { "name": "Doe" }
jq '.name' $tf | tee $tf
cat $tf
> 
> #no output, file is blank

海绵会产生所需的输出

tf=/tmp/simple
jq -n '.name="Doe"' > $tf
cat $tf
> { "name": "Doe" }
jq '.name' $tf | sponge $tf
cat $tf
> "Doe"
> # we got the expected output

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2014-04-19
    • 2018-12-05
    相关资源
    最近更新 更多