A menudo quiero enviar datos de cadenas relativamente cortas (aunque podrían ser varias líneas) a programas de línea de comandos que solo aceptan entradas de archivos (por ejemplo, wdiff) de forma repetida. Claro que puedo crear uno o más archivos temporales, guardar la cadena allí y ejecutar el comando con el nombre del archivo como parámetro. Pero me parece que este procedimiento sería muy ineficiente si los datos se escriben realmente en el disco y también podría dañar el disco más de lo necesario si repito este procedimiento muchas veces, p. si quiero alimentar líneas individuales de archivos de texto largos a wdiff. ¿Hay alguna forma recomendada de eludir esto, por ejemplo, mediante el uso de pseudo archivos como tuberías para almacenar los datos temporalmente sin escribirlos en el disco (o escribirlos solo si excede una longitud crítica)? Tenga en cuenta que wdiff toma dos argumentos y, según tengo entendido, no será posible alimentar los datos haciendo algo como wdiff <"text"
.
Respuesta aceptada:
Utilice una canalización con nombre. A modo de ilustración:
mkfifo fifo
echo -e "hello worldnnext linenline 3" > fifo
El -e
le dice a echo que interprete correctamente el escape de nueva línea (n
). Esto bloqueará, es decir, su shell se bloqueará hasta que algo lea los datos de la tubería.
Abra otro shell en algún lugar y en el mismo directorio:
cat fifo
Leerás el eco, que liberará el otro caparazón. Aunque la canalización existe como un nodo de archivo en el disco, los datos que pasan a través de ella no lo hacen; todo tiene lugar en la memoria. Puede fondo (&
) el eco.
La tubería tiene un búfer de 64k (en Linux) y, como un socket, bloqueará el escritor cuando esté lleno, por lo que no perderá datos siempre que no elimine prematuramente al escritor.