Was ist der Unterschied zwischen Cat und Tee?

Was ist der Unterschied zwischen Cat und Tee?

Ich habe mit Apache herumgespielt php.iniund 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 catund ?tee

Antwort1

Kurz zusammengefasst: catliest aus Dateien, deren Namen Sie übergeben, teeschreibt aber in diese. Nur wenn Sie keine Dateinamen übergeben, haben sie dieselbe Wirkung. Andernfalls kann die Verwendung von „ teewhen you mean“ catDateien überschreiben, die Sie eigentlich lesen wollten, was zu versehentlichem Datenverlust führt.

catund teeverhalten 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 catund teeDateinamen übergeben, verhalten sie sich unterschiedlich und Sie können sogar versehentlich Dateien überschreiben und Daten verlieren, wenn Sie ihre Namen an übergeben, teeobwohl Sie sie eigentlich an übergeben wollten cat.

Der Grund , warum catund teedasselbe 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. catliest potenziell viele Dateien und sendet ihre Ausgabe an einen Ort, während teeeine Eingabe gelesen und an potenziell viele Dateien gesendet wird.

Katze

catkopiert den Inhalt aller Eingabedateien nachStandardausgabe, eine nach der anderen. Das heißt, es verkettet die Dateien. Beispielsweise cat x ygibt es den Inhalt xvon 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 catmitNEINDateinamen, 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 catverhält sich wie cat -, da cat,wie verschiedene andere Befehle, behandelt es -speziell und betrachtet es als Bezeichnung für die Standardeingabe.)

T-Shirt

teekopiert 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 xliest seine Eingabe, schreibt sie in die Datei xund schreibt sie auch in seine eigene Standardausgabe. tee x yliest seine Eingabe, schreibt sie in die Datei xundAuchin die Datei yund schreibt sie auch in seine eigene Standardausgabe.

Die häufigste Verwendung von teebesteht darin, es mit einem einzelnen Dateinamenargument in eine Pipeline einzufügen. Angenommen, Sie leiten die Ausgabe eines Befehls namens fooan 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, logfiledamit 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 -aOption. 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 catder teeBefehl 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 catbeim Ausführen teeohne 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 catoder teeohne Argumente verwenden. Wenn Sie catdann verwenden, wissen die Leute, was Sie meinen. teeohne Argumente ist in Ordnung, aber essieht auswie ein Fehler. Manchmal wird dies beschrieben, indem man sagt, dass catdies deridiomatischso geht das.

catBeachten Sie auch, dass die von und unterstützten Befehlszeilenoptionen teeunterschiedlich 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 catUndman teefür Einzelheiten, insbesondere hierzu.

Antwort2

Zusammenfassend catist zum Lesen (manuelle EingabeUndDateien) und Schreiben (mit >und >>) in Dateien. Und teehandelt 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 pingBefehlsUndDiese Ausgabe wird in die ping_report.txtDatei geschrieben (die natürlich später analysiert wird). Wenn der -aParameter verwendet wird, wird die Eingabe (Ausgabe des ersten Befehls) an die ping_report.txtDatei angehängt, andernfalls wird der aktuelle Inhalt durch die neue Eingabe überschrieben.

verwandte Informationen