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
有一个在这个意义上,数据没有差别文件中的将是相同的,如果echo和tee成功,如果该文件是由当前用户写入执行。
该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 命令,而不是整个过程,其中 >> 甚至在提升的权限启动之前就启动了。
| 归档时间: |
|
| 查看次数: |
5303 次 |
| 最近记录: |