Warum ist sort -o nützlich?

32

Die UNIX-Philosophie sagt: Mach eine Sache und mach es gut. Erstellen Sie Programme, die Text verarbeiten, da dies eine universelle Schnittstelle ist.

Der sortBefehl, zumindest GNU sort, hat die -oOption, statt in eine Datei auszugeben stdout. Warum ist es sort foobar -o whatevernützlich, wenn ich nur könnte sort foobar > whatever?

strugee
quelle
3
GNU ist nicht UNIX. In vielen Aspekten ist es anders, zum Beispiel bei ausführlichen Argumenten (--help usw.).
Sakisk
@faif ja das stimmt . aber ich würde argumentieren, dass dies keine Antwort auf diese spezielle Frage ist.
Strugee
2
Deshalb habe ich es als Kommentar und nicht als Antwort
hinterlassen

Antworten:

47

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 Datei fooin Vorbereitung auf den Empfang der Ausgabe abgeschnitten . Und dann gibt es nichts zu sortieren. Ohne "-o" wäre dies der richtige Weg sort < foo > bar ; mv bar foo. Ich gehe davon aus, dass die -oOption etwas Ähnliches bewirkt, ohne dass Sie sich darum kümmern müssen.

Kurtm
quelle
12
Sie können auch sudo sort -o /some/placefestlegen, dass Ihr nicht berechtigter Benutzer keine Berechtigung zum Schreiben hat.
Bahamat
8
Und um Verwechslungen mit Bahamats Kommentar zu vermeiden: Er sagt nicht, dass sie eine Datei sortieren können, für die sie keine Berechtigungen haben. Die E / A-Umleitung funktioniert ... schlecht mit sudo. Da die Umleitung in Ihrer Shell stattfindet (sudo ist nur ein Befehl, den es ausführen wird), ist es ärgerlich, die Umleitung mit einem Befehl über sudo zu verwenden. (Ich war anfangs verwirrt darüber, was Bahamat sagte, also dachte ich, andere könnten auch verwirrt sein).
Kurtm
3
Nur um Devil's Advocate zu spielen, gibt es tatsächlich Alternativen zu den beiden Problemen "Eingabedatei ist gleich Ausgabedatei" und "Privilegierte Umleitung". Für "input = output" gibt es 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änken tee.
JW013
Gute Argumente. Obwohl die -oOption sortlange 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 teefunktioniert dies hervorragend. In den meisten Fällen möchten Sie jedoch, dass das Ganze privilegiert ist, und sudostolpern darüber. Und sudo grep file | sudo teeist albern.
Kurtm
1
sortmuss 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.
Stéphane Chazelas
12

Die Option '-o' war bereits in sortder sechsten Edition von Unix enthalten

Ich stimme Ihnen jedoch zu, dass dies nicht der Unix-Philosophie entspricht. uniqhatte diese Option nicht (und sorthatte keine -udamals).

Auf meinem PDP-11 verwendete ich ein kleines Programm, das einen Parameter annehmen würde:

renac whatever

Wenn whateverbereits vorhanden, würde alles von stdin in eine temporäre Datei geschrieben, die erst umbenannt wurde, whatevernachdem die stdin-Eingabe ausgetrocknet war. Auf diese Weise können Sie die Ausgabe eines beliebigen Befehls weiterleiten, renacanstatt 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).

Anthon
quelle
Wenn ich es aptrichtig verstanden habe, können gewürzte GNU / Linux- Benutzer eine neu geschriebene Version der renacbereitgestellten Funktionalität mit einem Programm namens sponge(from man: Standardeingabe ), package aufsaugen und in eine Datei schreiben moreutils`.
41754 06.10.13
@uprego. Ich habe nur nach der Quelle von sponge.c gesucht und es scheint viel Code-Overhead zu haben, da die Funktionen zum Abwaschen (stdin -> stdout) verwendet werden.
Anthon
@uprego wurde weder von GNU erstellt spongenoch wurde moreutilses von GNU erstellt.
jw013
Das wollte ich nicht behaupten.
41754