海绵和T恤之间的差异

crs*_*ezf 6 linux

做一些工作我发现这个"海绵"命令与"tee"相同,但找不到何时更好地使用其中一个.有人可以解释一下吗?

mat*_*dev 11

他们中没有一个人沉浸在stderr中 ; 只有标准.' tee ' 在stdout和文件上写stdin.' sponge ' 只将stdin写在文件上; 没有错误,没有输出.(即:与' tee ' 不同,' 海绵 '不会写在标准输出上).除了,

"在打开输出文件之前,海绵吸收了所有输入"

(来自其手册)

它们之间的这种差异是非常相关的:' tee '"读取一个字节","写入该字节"; ' sponge '等待接收所有输入,然后写下来.

阅读手册页很有帮助.

  • `展开 foo.txt | 海绵 foo.txt`,另见:https://unix.stackexchange.com/q/207919/43390 (2认同)

小智 5

在实践中,如果你进行迭代处理,会有很大的差异;由于 tee 将逐字节读取,如果您的源文件也是目标文件,则由于强制重定向,您最终可能会得到空白文件。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
Run Code Online (Sandbox Code Playgroud)

海绵将产生所需的输出

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
Run Code Online (Sandbox Code Playgroud)