¿Por qué es útil sort -o?

32

La filosofía de UNIX dice: haz una cosa y hazlo bien. Haga programas que manejen texto, porque esa es una interfaz universal.

El sortcomando, al menos GNU sort, tiene una -oopción para enviar a un archivo en lugar de stdout. ¿Por qué es, digamos, sort foobar -o whateverútil cuando podría simplemente sort foobar > whatever?

Strugee
fuente
3
GNU no es UNIX. En muchos aspectos es diferente, por ejemplo, argumentos detallados (--help, etc.).
sakisk
@faif sí, eso es cierto . pero diría que esa no es una respuesta a esta pregunta específica.
strugee
2
Es por eso que lo dejé como un comentario y no como una respuesta :)
sakisk

Respuestas:

47

No es solo el tipo GNU lo que lo tiene. El tipo BSD también lo tiene. ¿Y por qué?
(Pensé que era una buena pregunta también ...)

Desde la página de manual: "El argumento dado es el nombre de un archivo de salida que se utilizará en lugar de la salida estándar. Este archivo puede ser el mismo que uno de los archivos de entrada".

No puede ir al mismo archivo con redirección, la redirección de salida borra el archivo.

Para aclarar aún más, si quisiera ordenar un archivo y poner los resultados ordenados en el mismo lugar, podría pensar en intentarlo sort < foo > foo. Excepto que la redirección de salida trunca el archivo fooen preparación para recibir la salida. Y luego no hay nada que ordenar. Sin "-o" la forma de hacerlo sería sort < foo > bar ; mv bar foo. Supongo que la -oopción hace algo similar sin que tenga que preocuparse por ello.

kurtm
fuente
12
También puede hacer sudo sort -o /some/placeque su usuario no privilegiado no tenga permiso para escribir.
bahamat
8
Y para ayudar a evitar confusiones con el comentario de bahamat: no está diciendo que puedan ordenar un archivo para el que no tienen permisos. La redirección de E / S funciona ... mal con sudo. Dado que la redirección se lleva a cabo en su shell (sudo es solo un comando que se ejecutará), usar la redirección con un comando a través de sudo es molesto. (Inicialmente estaba confundido sobre lo que estaba diciendo bahamat, así que pensé que otros también podrían estar confundidos).
kurtm
3
Solo para jugar al abogado del diablo, en realidad hay alternativas tanto para el problema del "archivo de entrada es el mismo que el archivo de salida" como para el problema de la "redirección privilegiada", y ambas alternativas están más en el espíritu de "hacer una cosa bien". Para "input = output", hay sponge(parte de moreutils). Para la redirección privilegiada hay canalización a | sudo tee, que también tiene el beneficio de limitar la escalada de privilegios a un solo programa simple tee.
jw013
Buenos puntos. Aunque la -oopción de sortexistir existió mucho antes que la esponja. Es al menos tan antiguo como 4.4-lite2 (que es donde comienza el historial en OpenBSD CVS). Y para un caso en el que está operando en un archivo no privilegiado y escribiendo en un área privilegiada, | sudo teefunciona muy bien, pero la mayoría de las veces, desea que todo sea privilegiado y sudolo hace tropezar. Y sudo grep file | sudo teees tonto.
kurtm
1
sortnecesita leer toda la entrada antes de que pueda comenzar a generar algo, es por eso que puede sobrescribir su entrada de manera segura. Puede almacenar los datos en la memoria o en archivos temporales antes de comenzar a enviarlos.
Stéphane Chazelas
12

La opción '-o' ya estaba en sortla sexta edición de Unix

Sin embargo, estoy de acuerdo con usted en que no está dentro de la filosofía de Unix. uniqno tenía esa opción (y sortno tenía un -uentonces).

En mi PDP-11 usé un pequeño programa que tomaría un parámetro:

renac whatever

Si whateverya existiera, escribiría todo, desde stdin a un archivo temporal, que solo fue renombrado whateverdespués de que la entrada stdin se agotara. De esa manera, podría canalizar la salida de cualquier comando en renaclugar de redirigir al nombre del archivo sin la posibilidad de sobrescribir la entrada. Resolver el problema de sobrescritura de esa manera es, en mi humilde opinión, más conforme a la filosofía de Unix.

Algunas adiciones posteriores al programa fueron: no sobrescribir el archivo de salida si no había llegado nada en stdin (por ejemplo, como resultado de escribir mal parte de la línea de comando), y permitir una opción para agregar stdin al archivo nombrado.

Este fue uno de los primeros (si no el primero) programas reales de C que hice (para mi trabajo lo desarrollé principalmente en Pascal en ese sistema).

Anthon
fuente
Si entendí bien, las personas con aptsabor a GNU / Linux pueden tener una versión reescrita de la funcionalidad renacprovista, con un programa llamado sponge(de man: absorber la entrada estándar y escribir en un archivo ), package moreutils`.
41754
@uprego. Acabo de buscar la fuente de sponge.c y parece tener una gran cantidad de código general debido a la funcionalidad de esponja (stdin -> stdout).
Anthon
@uprego ni spongetampoco moreutilsfueron creados por GNU.
jw013
No tengo la intención de afirmar eso.
41754