La filosofía de UNIX dice: haz una cosa y hazlo bien. Haga programas que manejen texto, porque esa es una interfaz universal.
El sort
comando, al menos GNU sort, tiene una -o
opció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 archivofoo
en 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-o
opción hace algo similar sin que tenga que preocuparse por ello.fuente
sudo sort -o /some/place
que 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
.-o
opción desort
existir 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 tee
funciona muy bien, pero la mayoría de las veces, desea que todo sea privilegiado ysudo
lo hace tropezar. Ysudo grep file | sudo tee
es tonto.sort
necesita 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
sort
la sexta edición de UnixSin embargo, estoy de acuerdo con usted en que no está dentro de la filosofía de Unix.
uniq
no tenía esa opción (ysort
no tenía un-u
entonces).En mi PDP-11 usé un pequeño programa que tomaría un parámetro:
Si
whatever
ya existiera, escribiría todo, desde stdin a un archivo temporal, que solo fue renombradowhatever
después de que la entrada stdin se agotara. De esa manera, podría canalizar la salida de cualquier comando enrenac
lugar 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
apt
sabor a GNU / Linux pueden tener una versión reescrita de la funcionalidadrenac
provista, con un programa llamadosponge
(deman
: absorber la entrada estándar y escribir en un archivo), package
moreutils`.sponge
tampocomoreutils
fueron creados por GNU.