Cree un archivo virtual que en realidad sea un comando


18

¿Hay alguna forma de crear un archivo virtual, de modo que la lectura del archivo realmente se lea desde el stdoutcomando? escribir en el archivo es realmente escribir en el stdincomando?

Hasta ahora, he incluido esto inotifywaiten un archivo, que llama a un comando cuando se modifica el archivo, tomando su entrada del archivo y volviendo a escribirlo.

Sin inotifywaitembargo, no me gusta que deba reiniciarse constantemente (y tengo que asegurarme de que siempre se esté ejecutando). Solo uso este archivo tal vez dos veces por semana.

Respuestas:


17

Quizás estés buscando una tubería 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 tubería se fusionan, incluso si hay múltiples procesos de escritura. Si se leen múltiples procesos, 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 concurrentes, pero esto está más allá de las capacidades de los scripts de shell básicos.

En el extremo más compleja de la escala están los sistemas de archivos personalizados , que permite diseñar y montar un sistema de ficheros donde cada uno open, writeetc., 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 .


3

Algunas cosas a tener en cuenta con respecto a las canalizaciones con nombre: una canalización no puede, a diferencia de un archivo, tener múltiples lectores. Una vez que se lee su contenido, desaparece. Por lo tanto, debe realizar un bucle, es decir, deberá empujar constantemente el contenido en la tubería desde el escritor.

He estado buscando una respuesta para esta pregunta y lo único que he podido encontrar es scriptfs, que se basa en fusible .


1

Lo que usted describe es esencialmente un archivo especial FIFO, vea fifo(7). Son creados por mkfifo(1), y un proceso puede abrirlos bajo Linux para R / W (no todos los sistemas Unixy manejan eso). Dos procesos independientes pueden usarlo para comunicarse.


0

La forma más fácil de "Crear un archivo virtual que en realidad es un comando" es extender el sistema de archivos FUSE. Es muy fácil de hacer con bibliotecas como fusepy.

Aquí hay un ejemplo de un sistema de archivos FUSE que le permite leer archivos HTTP / HTTPS / FTP como si estuvieran presentes en su propia caja de Linux. De manera similar, puede crear algo que ejecute cualquier comando para el mismo en la lectura.

Si observa el código fuente , apenas tiene 50 líneas de código (excluyendo cualquier código repetitivo).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.