¿Hay alguna forma de crear un archivo virtual, de modo que la lectura del archivo realmente se lea desde el stdout
? de un comando; escribir en el archivo es realmente escribir en el stdin
de un comando?
Hasta ahora he hecho esto con un inotifywait
en un archivo, que llama a un comando cuando se modifica el archivo, toma su entrada del archivo y la vuelve a escribir.
No me gusta que el inotifywait
Sin embargo, debe reiniciarse constantemente (y debo asegurarme de que siempre esté funcionando). Solo uso este archivo quizás dos veces por semana.
Respuesta aceptada:
Puede estar buscando una canalización con nombre.
mkfifo f
{
echo 'V cebqhpr bhgchg.'
sleep 2
echo 'Urer vf zber bhgchg.'
} >f
rot13 < f
Escribir en la tubería no inicia el programa de escucha. Si desea procesar la entrada en un bucle, debe mantener un programa de escucha en ejecución.
while true; do rot13 <f >decoded-output-$(date +%s.%N); done
Tenga en cuenta que todos los datos escritos en la canalización se fusionan, incluso si hay varios procesos de escritura. Si varios procesos están leyendo, solo uno obtiene los datos. Por lo tanto, una tubería puede no ser adecuada para situaciones concurrentes.
Un socket con nombre puede manejar conexiones simultáneas, pero esto está más allá de las capacidades de los scripts de shell básicos.
En el extremo más complejo de la escala se encuentran los sistemas de archivos personalizados, que le permiten diseñar y montar un sistema de archivos donde cada open
, write
, etc., desencadena una función en un programa. La inversión mínima es de decenas de líneas de codificación no trivial, por ejemplo en Python. Si solo desea ejecutar comandos al leer archivos, puede usar scriptfs o fuseflt.