在做一些工作时,我发现这个“sponge”命令与“tee”的作用相同,但找不到何时最好使用其中之一。
有人可以解释一下吗?
他们中没有人吸收stderr;仅标准输出。 'tee' 在 stdout 和文件上写入 stdin。 'sponge' 仅在文件上写入 stdin;没有错误,没有输出。 (即:与 'tee' 不同,'sponge' 不会写在 stdout 上)。 此外,
“海绵在打开输出文件之前吸收所有输入”
(来自其手册)
它们之间的区别非常相关:“tee”“读取一个字节”和“写入该字节”; 'sponge' 等待接收所有输入,然后写入。
在实践中,如果你进行迭代处理,会有很大的差异; 由于 tee 将逐字节读取,如果源文件也是目标文件,则由于强制重定向,您最终可能会得到空白文件。 Sponge,将在开始写入打开的文件之前读取所有输入。
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