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

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

这样做之间有什么区别:

echo "hahaha" >> file1

echo "hahaha" |tee -a file1

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

答案1

从数据的意义上来说没有什么区别在文件中echo如果和tee成功执行并且文件可由当前用户写入,则将是相同的。

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

另一个区别是,如果文件可以不是被写入,那么带有重定向的第一个命令甚至不会运行echo,而echo 在第二个命令中运行,但tee写入文件时会失败(tee但仍会在终端上生成文本)。

如果您运行一些长时间运行的进程并产生输出,这可能很重要:

long_running_thing >>file

long_running_thing如果file不可写,这甚至不会启动。

long_running_thing | tee -a file

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

您在问题末尾暗示的下一件要注意的事情是

sudo echo hello >>file

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

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

echo hello | sudo tee -a file

在这里,我们tee以 root 身份运行。不需要echo由 root 执行,但如果当前用户不拥有实际写入文件的实用程序,则需要以 root 身份(或拥有该文件的任何用户)执行。

另一种可能性是使用

sudo sh -c 'echo hello >>file'

或者

echo hello | sudo sh -c 'cat >>file'

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

答案2

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

例如:

wc -l | tee -a file1.txt file2.txt file3.txt

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

相关内容