Die UNIX-Philosophie besagt: Mach eine Sache und mach sie gut. Erstelle Programme, die Text verarbeiten, denn das ist eine universelle Schnittstelle.
Der sort
Befehl, zumindest GNU sort, hat eine -o
Option zur Ausgabe in eine Datei statt in stdout
. Warum ist beispielsweise sort foobar -o whatever
nützlich, wenn ich einfach könnte sort foobar > whatever
?
Antwort1
Nicht nur GNU hat es, sondern auch BSD. Und warum?
(Ich fand das auch eine gute Frage...)
Aus der Manpage: „Das angegebene Argument ist der Name einer Ausgabedatei, die anstelle der Standardausgabe verwendet werden soll. Diese Datei kann mit einer der Eingabedateien identisch sein.“
Sie können mit der Umleitung nicht zur gleichen Datei gehen, die Ausgabeumleitung löscht die Datei.
Um das noch deutlicher zu machen: Wenn ich eine Datei sortieren und die Sortierergebnisse an derselben Stelle ablegen wollte, würde ich vielleicht versuchen sort < foo > foo
, . Außer dass die Ausgabeumleitung die Datei abschneidet foo
, um die Ausgabe zu empfangen. Und dann gibt es nichts zu sortieren. Ohne „-o“ wäre die Vorgehensweise sort < foo > bar ; mv bar foo
. Ich gehe davon aus, dass die -o
Option etwas Ähnliches bewirkt, ohne dass Sie sich darum kümmern müssen.
Antwort2
Die Option '-o' war bereits im the sort
desSechste Ausgabe von Unix
Ich stimme jedoch mit Ihnen überein, dass dies nicht der Unix-Philosophie entspricht. uniq
Diese Option gab es nicht (und damals sort
auch nicht -u
).
Auf meinem PDP-11 habe ich ein kleines Programm verwendet, das einen Parameter annimmt:
renac whatever
Wenn whatever
es bereits existiert, würde es alles von stdin in eine temporäre Datei schreiben, die erst umbenannt wird, whatever
nachdem der stdin-Eingang versiegt ist. Auf diese Weise können Sie die Ausgabe jedes Befehls in die Datei umleiten, renac
anstatt sie auf den Dateinamen umzuleiten, ohne die Möglichkeit zu haben, den Eingang zu überschreiben. Das Überschreibproblem auf diese Weise zu lösen, entspricht meiner Meinung nach eher der Unix-Philosophie.
Einige spätere Ergänzungen zum Programm waren: Kein Überschreiben der Ausgabedatei, wenn nichts über stdin angekommen war (z. B. aufgrund eines Tippfehlers in der Befehlszeile) und Zulassen einer Option zum Anhängen von stdin an die benannte Datei.
Dies war eines der ersten (wenn nicht das erste) echten C-Programme, die ich erstellt habe (für meinen Job habe ich auf diesem System hauptsächlich in Pascal entwickelt).