Die UNIX-Philosophie sagt: Mach eine Sache und mach es gut. Erstellen Sie Programme, die Text verarbeiten, da dies eine universelle Schnittstelle ist.
Der sort
Befehl, zumindest GNU sort, hat die -o
Option, statt in eine Datei auszugeben stdout
. Warum ist es sort foobar -o whatever
nützlich, wenn ich nur könnte sort foobar > whatever
?
sort
unix-philosophy
strugee
quelle
quelle
Antworten:
Es ist nicht nur die GNU-Sorte, die es hat. BSD Sort hat es auch. Und warum?
(Ich fand es auch eine gute Frage ...)
Auf 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 nicht mit Umleitung zu derselben Datei wechseln, da die Ausgabeumleitung die Datei löscht.
Zur weiteren Klärung, ob ich eine Datei sortieren und die sortierten Ergebnisse an derselben Stelle ablegen möchte, könnte ich versuchen
sort < foo > foo
. Mit Ausnahme der Ausgabeumleitung wird die Dateifoo
in Vorbereitung auf den Empfang der Ausgabe abgeschnitten . Und dann gibt es nichts zu sortieren. Ohne "-o" wäre dies der richtige Wegsort < 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.quelle
sudo sort -o /some/place
festlegen, dass Ihr nicht berechtigter Benutzer keine Berechtigung zum Schreiben hat.sponge
(einen Teil von moreutils). Für die privilegierte Umleitung gibt es eine Weiterleitung an| sudo tee
, die auch den Vorteil hat, die Eskalation von Berechtigungen auf ein einziges einfaches Programm zu beschränkentee
.-o
Optionsort
lange vor Schwamm existierte. Es ist mindestens so alt wie 4.4-lite2 (wo die Geschichte in OpenBSD CVS beginnt). Und in einem Fall, in dem Sie mit einer nicht privilegierten Datei arbeiten und in einen privilegierten Bereich schreiben,| sudo tee
funktioniert dies hervorragend. In den meisten Fällen möchten Sie jedoch, dass das Ganze privilegiert ist, undsudo
stolpern darüber. Undsudo grep file | sudo tee
ist albern.sort
muss die gesamte Eingabe lesen, bevor sie ausgegeben werden kann. Deshalb kann sie die Eingabe sicher überschreiben. Möglicherweise werden die Daten im Speicher oder in temporären Dateien gespeichert, bevor mit der Ausgabe begonnen wird.Die Option '-o' war bereits in
sort
der sechsten Edition von Unix enthaltenIch stimme Ihnen jedoch zu, dass dies nicht der Unix-Philosophie entspricht.
uniq
hatte diese Option nicht (undsort
hatte keine-u
damals).Auf meinem PDP-11 verwendete ich ein kleines Programm, das einen Parameter annehmen würde:
Wenn
whatever
bereits vorhanden, würde alles von stdin in eine temporäre Datei geschrieben, die erst umbenannt wurde,whatever
nachdem die stdin-Eingabe ausgetrocknet war. Auf diese Weise können Sie die Ausgabe eines beliebigen Befehls weiterleiten,renac
anstatt zum Dateinamen umzuleiten, ohne die Eingabe zu überschreiben. Das Überschreibproblem auf diese Weise zu lösen, entspricht meiner Meinung nach eher der Unix-Philosophie.Einige spätere Ergänzungen des Programms waren: die Ausgabedatei nicht zu überschreiben, wenn nichts auf stdin angekommen war (z. B. aufgrund einer fehlerhaften Eingabe eines Teils der Befehlszeile), und die Option zuzulassen, stdin an die angegebene Datei anzuhängen.
Dies war eines der ersten (wenn nicht das erste) echten C-Programme, das ich erstellt habe (für meinen Job habe ich hauptsächlich in Pascal auf diesem System entwickelt).
quelle
apt
richtig verstanden habe, können gewürzte GNU / Linux- Benutzer eine neu geschriebene Version derrenac
bereitgestellten Funktionalität mit einem Programm namenssponge
(fromman
: Standardeingabe), package
aufsaugen und in eine Datei schreiben moreutils`.sponge
noch wurdemoreutils
es von GNU erstellt.