Créez un fichier virtuel qui est en fait une commande

18

Existe-t-il un moyen de créer un fichier virtuel, de telle sorte que la lecture du fichier se lit réellement à partir stdoutd'une commande; écrire dans le fichier est-il en train d'écrire dans la stdincommande?

Jusqu'à présent, j'ai critiqué cela avec un inotifywait un fichier, qui appelle une commande lorsque le fichier est modifié, en prenant son entrée dans le fichier et en l'écrivant.

Je n'aime pas que le inotifywaitdoit être constamment redémarré (et je dois m'assurer qu'il fonctionne toujours). Je n'utilise ce fichier que peut-être deux fois par semaine.

jsj
la source

Réponses:

17

Vous recherchez peut-être une pipe nommée .

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

L'écriture dans la pipe ne démarre pas le programme d'écoute. Si vous souhaitez traiter l'entrée en boucle, vous devez maintenir un programme d'écoute en cours d'exécution.

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

Notez que toutes les données écrites dans le canal sont fusionnées, même s'il existe plusieurs processus d'écriture. Si plusieurs processus sont en cours de lecture, un seul obtient les données. Un tuyau peut donc 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.

A l'extrémité la plus complexe de l'échelle sont des systèmes de fichiers personnalisés , qui vous permet de concevoir et de monter un système de fichiers où chaque open, writeetc., déclenche une fonction dans un programme. L'investissement minimum est de dizaines de lignes de codage non trivial, par exemple en Python . Si vous ne souhaitez exécuter des commandes que lors de la lecture de fichiers, vous pouvez utiliser scriptfs ou fuseflt .

Gilles 'SO- arrête d'être méchant'
la source
3

Certaines choses à savoir concernant les canaux nommés: Un tube ne peut pas - contrairement à un fichier - avoir plusieurs lecteurs. Une fois son contenu lu, il a disparu. Vous devez donc faire une boucle, c'est-à-dire que vous devrez constamment pousser le contenu dans le tuyau de l'écrivain.

J'ai cherché une réponse moi - même à cette question et la seule autre chose que j'ai pu trouver est scriptfs qui est basé sur le fusible .

unixhacker2010
la source
1

Ce que vous décrivez est essentiellement un fichier spécial FIFO, voir fifo(7). Ils sont créés par mkfifo(1), et un processus peut ensuite les ouvrir sous Linux pour R / W (tous les systèmes Unixy ne le gèrent pas). Deux processus indépendants peuvent ensuite l'utiliser pour communiquer.

vonbrand
la source
0

La façon la plus simple de «créer un fichier virtuel qui est en fait une commande» consiste à étendre le système de fichiers FUSE. C'est très facile à faire avec des bibliothèques comme fusepy.

Voici un exemple d'un système de fichiers FUSE qui vous permet de lire des fichiers HTTP / HTTPS / FTP comme s'ils étaient présents sur votre propre boîte Linux. Vous pouvez également créer quelque chose qui exécute n'importe quelle commande pour la même chose en lecture.

Si vous regardez le code source, ce sont à peine 50 lignes de code (à l'exclusion de tout code passe-partout).

supersan
la source