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?
sort
unix-philosophy
Strugee
fuente
fuente

Respuestas:
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 archivofooen preparación para recibir la salida. Y luego no hay nada que ordenar. Sin "-o" la forma de hacerlo seríasort < foo > bar ; mv bar foo. Supongo que la-oopción hace algo similar sin que tenga que preocuparse por ello.fuente
sudo sort -o /some/placeque su usuario no privilegiado no tenga permiso para escribir.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 simpletee.-oopción desortexistir 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 ysudolo hace tropezar. Ysudo grep file | sudo teees tonto.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.La opción '-o' ya estaba en
sortla sexta edición de UnixSin embargo, estoy de acuerdo con usted en que no está dentro de la filosofía de Unix.
uniqno tenía esa opción (ysortno tenía un-uentonces).En mi PDP-11 usé un pequeño programa que tomaría un parámetro:
Si
whateverya existiera, escribiría todo, desde stdin a un archivo temporal, que solo fue renombradowhateverdespués de que la entrada stdin se agotara. De esa manera, podría canalizar la salida de cualquier comando enrenaclugar 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).
fuente
aptsabor a GNU / Linux pueden tener una versión reescrita de la funcionalidadrenacprovista, con un programa llamadosponge(deman: absorber la entrada estándar y escribir en un archivo), packagemoreutils`.spongetampocomoreutilsfueron creados por GNU.