这样做之间有什么区别:
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 命令,而不是整个过程,其中 >> 甚至在提升的权限启动之前就启动了。