使用 echo 时,tee 和 >> 之间有什么区别吗?

iam*_*est 5 io-redirection tee stdout

这样做有什么区别:

echo "hahaha" >> file1
Run Code Online (Sandbox Code Playgroud)

echo "hahaha" |tee -a file1
Run Code Online (Sandbox Code Playgroud)

?

是的,我注意到我什至无法写入受保护的文件sudo echo,但如果我可以sudo tee。谢谢。

Kus*_*nda 13

有一个在这个意义上,数据没有差别文件中的将是相同的,如果echotee成功,如果该文件是由当前用户写入执行。

tee命令还会在标准输出上产生输出,显示也将附加到文件的文本。这不会发生在第一个命令中。

另一个区别是,如果无法写入文件,则带有重定向的第一个命令甚至不会运行echo,而echo 在第二个命令中运行,但tee写入文件时会失败(tee仍会产生文本虽然在终端上)。

在您运行一些产生输出的长时间运行的进程的情况下,这可能很重要:

long_running_thing >>file
Run Code Online (Sandbox Code Playgroud)

long_running_thing如果file不可写,这甚至不会开始。

long_running_thing | tee -a file
Run Code Online (Sandbox Code Playgroud)

这将执行long_running_thing并运行到最后,但file如果它不可写,则不会保存任何输出(并且输出还会从 写入终端tee)。

接下来要注意的是,您在问题末尾暗示的,是

sudo echo hello >>file
Run Code Online (Sandbox Code Playgroud)

如果当前用户file不可写,则不起作用。这是因为重定向是执行命令之前处理的(见上文)。

要附加到根拥有的文件,请使用

echo hello | sudo tee -a file
Run Code Online (Sandbox Code Playgroud)

在这里,我们tee以 root 身份运行。在echo不需要不以root身份来执行,但实际上写入文件需要的工具来执行,作为root(或任何用户所拥有的文件),如果它不是由当前用户拥有。

另一种可能性是使用

sudo sh -c 'echo hello >>file'
Run Code Online (Sandbox Code Playgroud)

或者

echo hello | sudo sh -c 'cat >>file'
Run Code Online (Sandbox Code Playgroud)

这将使用重定向将数据附加到文件中,但在这种情况下,执行重定向的 shell 以 root 身份运行,因此它不会因权限/所有权限制而在附加/创建文件时失败(它可能仍然失败如果例如file是目录的名称)。


小智 11

Tee 主要用于将输出重定向到多个文件,而不是单独调用复制命令。

例如:

wc -l | tee -a file1.txt file2.txt file3.txt
Run Code Online (Sandbox Code Playgroud)

您可以单独将权限提升到 tee 命令,而不是整个过程,其中 >> 甚至在提升的权限启动之前就启动了。