Comment créer un fichier virtuel sauvegardé sous Linux?

Quelle est la manière la plus simple de créer un fichier “virtuel” sous Linux, qui autoriserait la lecture, renvoyant toujours la sortie d’une commande particulière (exécutée à chaque lecture du fichier)? Ainsi, chaque opération de lecture provoquerait une exécution d’une commande, capturant sa sortie et la transmettant en tant que “contenu” du fichier.

Il n’y a aucun moyen de créer un soi-disant “fichier virtuel”. D’un autre côté, vous pourrez réaliser ce comportement en implémentant un système de fichiers synthétique simple dans l’espace utilisateur via FUSE. De plus, vous n’avez pas à utiliser c, il existe des liaisons même pour les langages de script tels que python.

Edit: Et les chances sont que quelque chose comme cela existe déjà: voir par exemple scriptfs .

C’est une excellente réponse que j’ai copiée ci-dessous.

Fondamentalement, les canaux nommés vous permettent de le faire dans les scripts, et Fuse vous permet de le faire facilement en Python .


Vous recherchez peut-être un tube nommé .

 mkfifo f { echo 'V cebqhpr bhgchg.' sleep 2 echo 'Urer vf zber bhgchg.' } >f rot13 < f 

L'écriture dans le tube ne lance pas le programme d'écoute. Si vous souhaitez traiter une entrée dans une boucle, vous devez continuer à exécuter un programme d'écoute.

 while true; do rot13 decoded-output-$(date +%s.%N); done 

Notez que toutes les données écrites sur le canal sont fusionnées, même si plusieurs processus sont écrits. Si plusieurs processus sont en cours de lecture, un seul reçoit les données. Ainsi, un tuyau peut ne pas convenir à des situations concurrentes.

Un socket nommé peut gérer des connexions simultanées, mais cela dépasse les capacités des scripts shell de base.

À la fin la plus complexe de l'échelle sont les systèmes de fichiers personnalisés , qui vous permettent de concevoir et de monter un système de fichiers où chaque open , write , etc. déclenche une fonction dans un programme. L'investissement minimum est des dizaines de lignes de codage non sortingvial, par exemple en Python . Si vous souhaitez uniquement exécuter des commandes lors de la lecture de fichiers, vous pouvez utiliser scriptfs ou fuseflt .

J’ai peur que ce ne soit pas facilement possible. Lorsqu’un processus lit un fichier, il utilise des appels système tels que open , fstat , read . Vous devrez intercepter ces appels et générer quelque chose de différent de ce qu’ils retourneraient. Cela nécessiterait d’écrire une sorte de module du kernel, et même dans ce cas, cela pourrait s’avérer impossible.

Cependant, si vous devez simplement déclencher quelque chose à chaque access à un fichier, vous pouvez jouer avec inotifywait :

 #!/bin/bash while inotifywait -qq -e access /path/to/file; do echo "$(date +%s)" >> /tmp/access.txt done 

Exécutez ceci comme processus d’arrière-plan et vous obtiendrez une entrée dans /tmp/access.txt chaque fois que votre fichier est en cours de lecture.

Personne ne l’a mentionné mais si vous pouvez choisir le chemin du fichier, vous pouvez utiliser l’entrée standard /dev/stdin .

Chaque fois que le programme cat s’exécute, il finit par lire le résultat de l’écriture du programme sur le tube, ce qui fait echo my input ici:

 for i in 1 2 3; do echo my input | cat /dev/stdin done 

les sorties:

 my input my input my input