
Ich habe mit Apache herumgespielt php.ini
und es so hinbekommen, dass beim Senden von E-Mails mit einer PHP-Datei, die diese mail()
Funktion hat, die E-Mail auf meinem Computer gespeichert wird, was für Tests und Webentwickler gut ist. Dies ist die Codezeile, die ich hinzugefügt habe php.ini
:
sendmail_path = "cat > /home/cam/Documents/TestEmails/`date '+%Y-%m-%d - %H-%M-%S'`.eml"
Auch diese Codezeile hat funktioniert:
sendmail_path = "tee > /home/cam/Documents/TestEmails/`date '+%Y-%m-%d - %H-%M-%S'`.eml"
Was ist der Unterschied zwischen den Befehlen cat
und ?tee
Antwort1
Kurz zusammengefasst:
cat
liest aus Dateien, deren Namen Sie übergeben,tee
schreibt aber in diese. Nur wenn Sie keine Dateinamen übergeben, haben sie dieselbe Wirkung. Andernfalls kann die Verwendung von „tee
when you mean“cat
Dateien überschreiben, die Sie eigentlich lesen wollten, was zu versehentlichem Datenverlust führt.
cat
und tee
verhalten sich gleich, wenn Sie ihnen keine Dateinamen geben. Das ist, was in Ihrem Beispiel passiert; die Befehle habenAusgabeumleitungen( >
), aber keine tatsächlichen Befehlszeilenargumente. Wenn Sie den Befehlen cat
und tee
Dateinamen übergeben, verhalten sie sich unterschiedlich und Sie können sogar versehentlich Dateien überschreiben und Daten verlieren, wenn Sie ihre Namen an übergeben, tee
obwohl Sie sie eigentlich an übergeben wollten cat
.
Der Grund , warum cat
und tee
dasselbe ohne Argumente tun, aber unterschiedliche Dinge mit als Argumente übergebenen Dateinamen tun, lässt sich erkennen, wenn man das Verhalten der beiden betrachtet. Im Allgemeinen haben sie ein fast entgegengesetztes Verhalten. cat
liest potenziell viele Dateien und sendet ihre Ausgabe an einen Ort, während tee
eine Eingabe gelesen und an potenziell viele Dateien gesendet wird.
Katze
cat
kopiert den Inhalt aller Eingabedateien nachStandardausgabe, eine nach der anderen. Das heißt, es verkettet die Dateien. Beispielsweise cat x y
gibt es den Inhalt x
von gefolgt vom Inhalt von aus y
. Wenn ein einzelner Dateiname übergeben wird, kopiert es den Inhalt dieser Datei in die Standardausgabe und stoppt dann, da es keine weiteren Argumente hat.
Wenn Sie cat
mitNEINDateinamen, es liest standardmäßig aus dem eigenenStandardeingabe. Im Grunde genommen bedeutet das, dass es alles liest, wasverrohrtoderumgeleitetoder was auch immer in ein Terminal eingegeben wird. (Man kann es auch so ausdrücken: Ohne Dateinamen cat
verhält sich wie cat -
, da cat
,wie verschiedene andere Befehle, behandelt es -
speziell und betrachtet es als Bezeichnung für die Standardeingabe.)
T-Shirt
tee
kopiert den Inhalt seiner Standardeingabe in alle seine Ausgabedateiensowie eine eigene StandardausgabeDas heißt, es funktioniert wie einT-Kreuzung- oder genauer gesagt,NT-Kreuzungen, an denenNist die Anzahl der Ausgabedateien, deren Namen Sie übergeben. Beispielsweise tee x
liest seine Eingabe, schreibt sie in die Datei x
und schreibt sie auch in seine eigene Standardausgabe. tee x y
liest seine Eingabe, schreibt sie in die Datei x
undAuchin die Datei y
und schreibt sie auch in seine eigene Standardausgabe.
Die häufigste Verwendung von tee
besteht darin, es mit einem einzelnen Dateinamenargument in eine Pipeline einzufügen. Angenommen, Sie leiten die Ausgabe eines Befehls namens foo
an die Eingabe eines Befehls namens weiter bar
. Sie könnten schreiben foo | bar
. Wenn Sie die Ausgabe aber auch in einer Datei namens protokollieren möchten, logfile
damit Sie sie überprüfen können, könnten Sie verwenden foo | tee logfile | bar
.
tee
überschreibt die Dateien, deren Namen Sie ihm geben, es sei denn, Sie übergeben ihm die -a
Option. In diesem Fall wird an sie angehängt. Um beispielsweise an dieses Protokoll anzuhängen, anstatt es zu überschreiben, können Sie verwenden foo | tee -a logfile | bar
.
Im Gegensatz zu behandelt cat
der tee
Befehl das Fehlen von Dateinamenargumenten nicht als Sonderfall. Stattdessen schreibt er seine Eingabe einfach inalles Nullder Dateien, deren Namen Sie ihm gegeben haben, und übergibt sie dann wie üblich an seine Standardausgabe. Der Effekt ist, dass wie bei auch cat
beim Ausführen tee
ohne Dateinamen die Standardeingabe in die Standardausgabe kopiert wird.
Die Kultur bevorzugt „cat“, wenn Sie nur stdin nach stdout kopieren möchten.
Sie können für diesen Zweck entweder cat
oder tee
ohne Argumente verwenden. Wenn Sie cat
dann verwenden, wissen die Leute, was Sie meinen. tee
ohne Argumente ist in Ordnung, aber essieht auswie ein Fehler. Manchmal wird dies beschrieben, indem man sagt, dass cat
dies deridiomatischso geht das.
cat
Beachten Sie auch, dass die von und unterstützten Befehlszeilenoptionen tee
unterschiedlich sind. Das ist wahrscheinlich zu erwarten, da sie meist unterschiedliche Dinge tun und ihr Verhalten daher auf völlig unterschiedliche Weise angepasst werden kann. Sieheman cat
Undman tee
für Einzelheiten, insbesondere hierzu.
Antwort2
Zusammenfassend cat
ist zum Lesen (manuelle EingabeUndDateien) und Schreiben (mit >
und >>
) in Dateien. Und tee
handelt nur vom Schreiben in Dateien - aber ingleichzeitigentsprechend der Ausgabe des Befehls, der als Eingabe dient.
Zum Beispiel:
ping 192.168.1.xx | tee [-a] ping_report.txt
Mit dem oben gezeigten Befehl können Siegleichzeitigsiehe die Ausgabe des ping
BefehlsUndDiese Ausgabe wird in die ping_report.txt
Datei geschrieben (die natürlich später analysiert wird). Wenn der -a
Parameter verwendet wird, wird die Eingabe (Ausgabe des ersten Befehls) an die ping_report.txt
Datei angehängt, andernfalls wird der aktuelle Inhalt durch die neue Eingabe überschrieben.