cat 和 tee 有什么区别?

cat 和 tee 有什么区别?

我正在研究 Apache,php.ini并得到了它,所以当我使用具有该mail()功能的 PHP 文件发送电子邮件时,它会将电子邮件保存在我的计算机上,这对测试和 Web 开发人员来说很有用。这是我在 中添加的代码行php.ini

sendmail_path = "cat > /home/cam/Documents/TestEmails/`date '+%Y-%m-%d - %H-%M-%S'`.eml"

这行代码也有效:

sendmail_path = "tee > /home/cam/Documents/TestEmails/`date '+%Y-%m-%d - %H-%M-%S'`.eml"

cat和命令之间有什么区别tee

答案1

总结: cat读取您传递其名称的文件,但tee写入这些文件。只有当您没有传递文件名时,它们才会产生相同的效果。否则,使用teewhen you meancat可能会覆盖您想要读取的文件,从而导致意外的数据丢失。

cat并且tee当您不给它们任何文件名时,它们的行为也类似。这就是您的示例中发生的情况;命令有输出重定向>)但没有实际的命令行参数。当您传递cattee命令文件名时,它们的行为会有所不同,您甚至可能会意外覆盖文件并丢失数据,因为tee您本想将它们传递给 ,但将它们的名称传递给cat

原因cattee在没有任何参数的情况下执行相同的操作,但将文件名作为参数传递时执行不同的操作,可以通过考虑各自的行为来辨别。一般来说,它们的行为几乎相反。cat读取可能许多文件并将其输出发送到一个位置,而tee读取一个输入并将其发送到可能许多文件。

cat将所有输入文件的内容复制到标准输出,一个接一个。也就是说,它将文件连接起来。例如,cat x y输出的内容x后跟的内容y。当传递单个文件名时,它会将该文件的内容复制到标准输出,然后由于没有其他参数,它会停止。

当你跑步cat文件名,它默认从自己的标准输入基本上,这意味着它会读取管道或者重定向或以其他方式输入到终端。(另一种说法是,没有文件名,cat行为类似于cat -,因为cat像其他各种命令一样-特殊处理并将其作为指定的标准输入。)

球座

tee将其标准输入的内容复制到其所有输出文件以及它自己的标准输出。也就是说,它的功能就像一个T 型路口——或者更准确地说,T 型路口是您传递给它的输出文件的数量。例如,tee x读取其输入,将其写入文件x,并将其写入其自己的标准输出。tee x y读取其输入,将其写入文件x,并将其写入文件到文件y,并将其写入其自己的标准输出。

最常见的用法tee是将其插入到带有单个文件名参数的管道中。例如,假设您将名为 的命令的输出foo通过管道传输到名为 的命令的输入bar。您可以编写foo | bar。但如果您还想将输出记录到名为 的文件中logfile以便检查它,则可以使用foo | tee logfile | bar

tee覆盖您为其指定名称的文件,除非您向其传递选项-a,在这种情况下它会将文件附加到这些文件。例如,要将文件附加到该日志而不是覆盖它,您可以使用foo | tee -a logfile | bar

与 不同cat,该tee命令不会将没有文件名参数的情况视为特殊情况。相反,它只是将其输入写入全零指定文件名的文件,然后照常将其传递到其标准输出。效果是,与 一样cattee不使用文件名运行也会将标准输入复制到标准输出。

当您只想将 stdin 复制到 stdout 时,文化青睐 cat。

虽然你可以使用cat或 而不tee使用任何参数来实现此目的,但如果你使用,cat那么人们就会明白你的意思。tee不带参数也可以,但是看起来cat就像一个错误。有时这被描述为惯用语的方法。

cat还请注意,和支持的命令行选项tee不同。您可能已经预料到了这一点,因为它们主要执行不同的操作,因此能够以完全不同的方式自定义其行为。请参阅man catman tee了解详细信息,特别是有关这一点。

答案2

总结一下cat就是阅读(手动输入文件) 和写入 (使用>>>) 文件。 和tee仅关于写入文件 - 但在同时地根据正在服务的命令的输出如何输入。

例如:

  • ping 192.168.1.xx | tee [-a] ping_report.txt

使用上面显示的命令你可以同时地ping查看命令的输出该输出将写入ping_report.txt文件中(当然稍后会进行分析)。如果-a使用了参数,则输入(第一个命令的输出)将附加到文件中ping_report.txt,否则它将用新输入覆盖当前内容。

相关内容