我正在研究 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
写入这些文件。只有当您没有传递文件名时,它们才会产生相同的效果。否则,使用tee
when you meancat
可能会覆盖您想要读取的文件,从而导致意外的数据丢失。
cat
并且tee
当您不给它们任何文件名时,它们的行为也类似。这就是您的示例中发生的情况;命令有输出重定向(>
)但没有实际的命令行参数。当您传递cat
和tee
命令文件名时,它们的行为会有所不同,您甚至可能会意外覆盖文件并丢失数据,因为tee
您本想将它们传递给 ,但将它们的名称传递给cat
。
原因cat
和tee
在没有任何参数的情况下执行相同的操作,但将文件名作为参数传递时执行不同的操作,可以通过考虑各自的行为来辨别。一般来说,它们的行为几乎相反。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
命令不会将没有文件名参数的情况视为特殊情况。相反,它只是将其输入写入全零指定文件名的文件,然后照常将其传递到其标准输出。效果是,与 一样cat
,tee
不使用文件名运行也会将标准输入复制到标准输出。
当您只想将 stdin 复制到 stdout 时,文化青睐 cat。
虽然你可以使用cat
或 而不tee
使用任何参数来实现此目的,但如果你使用,cat
那么人们就会明白你的意思。tee
不带参数也可以,但是看起来cat
就像一个错误。有时这被描述为惯用语的方法。
cat
还请注意,和支持的命令行选项tee
不同。您可能已经预料到了这一点,因为它们主要执行不同的操作,因此能够以完全不同的方式自定义其行为。请参阅man cat
和man tee
了解详细信息,特别是有关这一点。
答案2
总结一下cat
就是阅读(手动输入和文件) 和写入 (使用>
和>>
) 文件。 和tee
仅关于写入文件 - 但在同时地根据正在服务的命令的输出如何输入。
例如:
ping 192.168.1.xx | tee [-a] ping_report.txt
使用上面显示的命令你可以同时地ping
查看命令的输出和该输出将写入ping_report.txt
文件中(当然稍后会进行分析)。如果-a
使用了参数,则输入(第一个命令的输出)将附加到文件中ping_report.txt
,否则它将用新输入覆盖当前内容。