Comment construisez-vous un tube de lecture-écriture avec lua?
J'aimerais faire l'équivalent de:
foo=$(echo "$foo"|someprogram)
dans lua -- c'est à dire, j'ai une variable qui contient un tas de texte, et je voudrais le faire passer à travers un filtre (implémenté en python, comme il arrive).
Un indice?
Ajouté: tiens vraiment à le faire sans l'aide d'un fichier temporaire
source d'informationauteur Anthony Towns
Vous devez vous connecter pour publier un commentaire.
Il n'y a rien dans le Lua de la bibliothèque standard pour permettre cela.
Voici une exploration en profondeur de la difficulté de faire une communication bidirectionnelle correctementet une proposition de solution:
Vous pouvez être intéressé par cette extension qui ajoute des fonctions à la
os
etio
espaces de noms pour faire une communication bidirectionnelle avec un sous-processus possible.Aha, un probablement la meilleure solution:
Tant que votre Lua prend en charge
io.popen
ce problème est facile. La solution est exactement comme vous l'avez indiqué, sauf qu'au lieu de$(...)
vous avez besoin d'une fonction comme celle-ci:Vous pouvez ensuite appeler
Je fais les choses comme cela tout le temps. Voici une relative fonction utile pour la formation de commandes:
Je suis tombé sur ce post en essayant de faire la même chose et n'a jamais trouvé une bonne solution, voir le code ci-dessous pour savoir comment j'ai résolu mes problèmes. Cette application permet aux utilisateurs d'accéder à stdin, stdout, stderr et obtenir le code d'état de retour. Un simple wrapper est appelé pour un simple tuyau d'appels.
Voici comment j'ai résolu le problème, il faut de
lua posix
.Pendant
myProgram
de l'exécution, vous l lire et à écrire à partir de la normale io et après cette partie de code, vous avez juste à écrire/lire surIN
etOUT
à communiquer avec le programme enfant.C'est facile, pas d'extensions nécessaires (testé avec lua 5.3).
enregistrer sous
inout.lua
et nechmod +x /tmp/inout.lua
Un pas très gentil solution qui évite un fichier temporaire...