Perché sort -o è utile?


32

La filosofia UNIX dice: fai una cosa e fallo bene. Crea programmi che gestiscano il testo, perché questa è un'interfaccia universale.

Il sortcomando, almeno ordinamento GNU, ha -oun'opzione per l'output in un file anziché stdout. Perché, diciamo, è sort foobar -o whateverutile quando potrei solo sort foobar > whatever?


3
GNU non è UNIX. Sotto molti aspetti è diverso, ad esempio argomenti dettagliati (--help, ecc.).
sakisk,

@faif sì è vero . ma direi che non è una risposta a questa domanda specifica.
strugee,

2
Ecco perché l'ho lasciato come commento e non come risposta :)
sakisk,

Risposte:


47

Non è solo il tipo GNU che ce l'ha. Anche l'ordinamento BSD ce l'ha. E perché?
(Ho pensato che fosse anche una buona domanda ...)

Dalla pagina man: "L'argomento fornito è il nome di un file di output da utilizzare al posto dell'output standard. Questo file può essere uguale a uno dei file di input."

Non è possibile passare allo stesso file con il reindirizzamento, il reindirizzamento dell'output cancella il file.

Per chiarire ulteriormente, se volessi ordinare un file e mettere i risultati ordinati nello stesso posto, potrei pensare di provare sort < foo > foo. Tranne il reindirizzamento dell'output tronca il file fooin preparazione per ricevere l'output. E poi non c'è niente da ordinare. Senza "-o" sarebbe il modo di farlo sort < foo > bar ; mv bar foo. Suppongo che l' -oopzione faccia qualcosa di simile senza farti preoccupare.


12
Puoi anche sudo sort -o /some/placeche il tuo utente non privato non abbia il permesso di scrivere.
bahamat,

8
E per evitare confusione con il commento di Bahamat: non sta dicendo che possono ordinare un file per il quale non dispongono delle autorizzazioni. Il reindirizzamento I / O funziona ... male con sudo. Poiché il reindirizzamento avviene nella shell (sudo è solo un comando che verrà eseguito), l'utilizzo del reindirizzamento con un comando tramite sudo è fastidioso. (Inizialmente ero confuso su ciò che Bahamat stava dicendo, quindi ho pensato che anche altri potrebbero essere confusi).
Kurtm,

3
Solo per interpretare l'avvocato del diavolo, ci sono in realtà alternative sia al problema "file di input è lo stesso del file di output" che al problema del "reindirizzamento privilegiato", ed entrambe le alternative sono più nello spirito di "fare bene una cosa". Per "input = output", c'è sponge(parte di moreutils). Per il reindirizzamento privilegiata c'è tubazioni a | sudo tee, che ha anche il vantaggio di limitare scalata di privilegi di un singolo programma semplice, tee.
jw013,

Punti buoni. Sebbene l' -oopzione sortesistesse molto prima della spugna. È vecchio almeno quanto 4.4-lite2 (che è dove la storia inizia in CVS OpenBSD). E per un caso in cui stai operando su un file non privilegiato e scrivendo in un'area privilegiata, | sudo teefunziona alla grande, ma per la maggior parte del tempo, vuoi che tutto sia privilegiato e sudoti fa inciampare. Ed sudo grep file | sudo teeè sciocco.
Kurtm,

1
sortdeve leggere l'intero input prima che possa iniziare a produrre qualcosa, ecco perché può sovrascriverlo in modo sicuro. Potrebbe archiviare i dati in memoria o in file temporanei prima di iniziare l'output.
Stéphane Chazelas,

12

L'opzione '-o' era già nella sortdella sesta edizione di Unix

Tuttavia sono d'accordo con te sul fatto che non rientra nella filosofia Unix. uniqnon aveva quell'opzione (e sortnon aveva un -uallora).

Sul mio PDP-11 ho usato un piccolo programma che avrebbe preso un parametro:

renac whatever

Se whateveresistesse già, scriverebbe qualsiasi cosa, da stdin a un file temporaneo, che è stato rinominato solo whateverdopo che l'input di stdin si è esaurito. In questo modo è possibile reindirizzare l'output di qualsiasi comando renacanziché reindirizzare al nome file senza la possibilità di sovrascrivere l'input. Risolvere il problema di sovrascrittura in questo modo è IMHO più conforme alla filosofia Unix.

Alcune aggiunte successive al programma sono state: non sovrascrivere il file di output se non era arrivato nulla su stdin (ad esempio a causa di errori di digitazione su parte della riga di comando) e consentire un'opzione per aggiungere stdin al file indicato.

Questo è stato uno dei primi (se non il primo) vero programma C che ho realizzato (per il mio lavoro ho sviluppato principalmente in Pascal su quel sistema).


Se ho capito bene, le aptpersone GNU / Linux con gusto possono avere una versione riscritta delle funzionalità renacfornite, con un programma chiamato sponge(da man: assorbire input standard e scrivere in un file ), package moreutils`.
41754

@uprego. Ho appena cercato la fonte di sponge.c e sembra avere un sacco di sovraccarico di codice a causa della funzionalità sponging (stdin -> stdout).
Anthon,

@uprego né spongemoreutilssono stati effettivamente creati da GNU.
jw013

Non ho intenzione di affermarlo.
41754
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.