J'essaye d'écrire un script bash qui lance plusieurs commandes et qui montre la progression avec zenity. Mon script est long donc je ne vais écrire ici qu'une version ultra light illustrant le problème :
(
echo "25" ; echo "# C'est parti"
var=$RANDOM
echo "50" ; echo "# La variable est $var"
echo "100" ; echo "# C'est fini"
) | zenity --progress --title="Test" --text="progression..." --percentage=0
echo $var
Le problème c'est que évidemment le echo $var ne renvoie rien. J'ai compris que c'est parce que $var est déclaré dans un processus fils et qu'il ne peut donc pas passé de variable au processus père. Je crois comprendre qu'il est possible d'utiliser fifo mais je ne comprends vraiment pas comment ca s'utilise. Chaque essai que j'ai fait s'est soldé par un échec (script qui reste en attente). Quelqu'un aurait-il une solution ?
# par exemple
Posté par solsTiCe (site web personnel) . Évalué à 2.
le fifo est bloquant tant qu'on a pas lu la valeur
[^] # Re: par exemple
Posté par yeKcim (site web personnel) . Évalué à 1.
Oui mais comment faire « # dans une autre shell » dans un script bash ?
# Mais pourquoi est-il aussi méchant ?
Posté par ymorin . Évalué à 5.
En effet.
D'abord, ici, fifo n'est qu'un nom de fichier; un fichier particulier : c'est un pipe nommé (pipe==fifo). En gros, c'est un tuyau. Un processus écrit d'un côté du tuyau, et un autre lit de l'autre côté. C'est à sens-unique.
Le problème des pipes, c'est qu'il ont une taille fixe, 4KiB IIRC. Le processus qui écrit est bloqué dès que le pipe est rempli, ce qui peut arriver si personne ne lit à l'autre bout, ou si l'autre bout ne se vide pas assez vite. Dès que le lecteur lit un bout du pipe, l'écrivain peut alors recommencer à le remplir. Ainsi de suite.
L'exemple que tu pointes (mal, ceci dit, il faut lire tout les commentaires pour voir à quoi tu fais référence) est bancal. Reprenons-le :
Si le contenu filtré :
dépasse les 4KiB, alors ca va bloquer en attendant que le pipe se libère, ce qui n'arrivera jamais avec ce script, puisque la lecture se fait après :
Donc, il faut mettre l'écrivain en arrière plan, pour qu'il puisse continuer à écrire.
En plus, il y a une erreur de syntaxe sur cette ligne :
MAIS ! Cela ne fonctionne plus si la sortie de la boucle est à son tour 'pipée' dans une commande :
Là, je sèche... :-/
[^] # Re: Mais pourquoi est-il aussi méchant ?
Posté par ymorin . Évalué à 1.
Alors, je crois que j'ai la réponse. Prenons ce bout de code :
Si je comprends bien POSIX dit explicitement (à la fin du chapitre) qu'un sous-shell doit être utilisé dans ce cas :
En fait, la commande while foo-bar; do blabla; done est une commande composée (multi-command), et en plus le résultat est pipé, donc ça rentre dans cette définition.
Donc il n'est pas possible de récupérer la valeur de '${var}' en dehors de la boucle while.
Donc, si tu veux récupérer sa valeur, tu devras faire un truc du genre :
C'est crade, mais ça marche... :-(
Hop,
Moi.
[^] # Re: Mais pourquoi est-il aussi méchant ?
Posté par Tonton Benoit . Évalué à 2.
À propos de bricolage pourquoi ne pas mettre zenity dans un sous processus au lieu de tout ton code si ça gêne pas ? genre :
Vous aurez compris le principe...
Bon ça reste crade, surtout le tail -f qui est le seul moyen que j'ai trouvé de "pooler" la fifo, si quelqu’un à mieux ?
[^] # Re: Mais pourquoi est-il aussi méchant ?
Posté par ymorin . Évalué à 1.
Ouais ! Bravo ! Nous avons un gagnat ! :-)
Ça, moi, j'aime bien ! Vraiment ! ;-)
Oui, deux points :
Hop,
Moi.
[^] # Re: Mais pourquoi est-il aussi méchant ?
Posté par Tonton Benoit . Évalué à 1.
Ha oui pas mal, en utilisant la sortie du script comme entrée pour zenity la pipe n'est pas détruite tant que le script tourne.
Bravo !
[^] # Re: Mais pourquoi est-il aussi méchant ?
Posté par ymorin . Évalué à 1.
Bon, pas d'autre améliorations ?
Aller, je ne résiste pas à faire une nouvelle proposition ! :-)
Voilà, c'est assez complet, avec tout plein de commentaires, tous les cas tordus auxquels j'ai pensé sont pris en compte, le ménage est fait.
Ne reste plus qu'à remplacer la boucle for par le vrai boulot à faire, abstraire un peu pour le rendre générique et réutilisable (au cas où il y ai besoin de plusieurs progress dans le même script), etc..
Je l'ai fait en Anglais, car je vais me le mettre de côté, çui-ci... :-)
Enjoy !
Hop,
Moi.
[^] # Re: Mais pourquoi est-il aussi méchant ?
Posté par BFG . Évalué à -2.
Il va être content celui qui a posé la question initiale, "tenez, je vous aide sur un simple message de forum, mais si vous acceptez mon aide, alors vous devez utiliser la licence que je choisis !". Enfin il peut tout de même se rabattre sur les messages précédents.
[^] # Re: Mais pourquoi est-il aussi méchant ?
Posté par ymorin . Évalué à 0.
Heu... Comment dire. C'est moi qui ai écrit le script. Je peux bien lui coller la licence que je veux, non ?
Certes, c'est le résultat d'un ensemble de réflexions partagées, mais si tu suis le cheminement des commentaires, tu verras tout de même comment j'en suis arrivé à ce script sans réutilisation de code... J'ai correctement crédité Tonton Benoit pour son idée de fifo créée avec mktemp et d'utilisation de la fifo en entrée de zenity .
Par ailleurs, aucune licence n'est visible sur la page du post. Donc si je n'en met pas une explicitement, il n'a pas le droit d'utiliser ce script, puisque par défaut le droit de propriété intellectuelle français (et ailleurs aussi, IIRC) n'autorise pas l'utilisation sans accord explicite de l'auteur. En précisant une licence telle que la GPLv2, je lui donne explicitement le droit, en se conformant à la licence, de réutiliser ce script.
Ceci dit, si je me trompe ( et c'est toujours possible, personne n'est infaillible, même pas moi ;-) ), du coup il ne peut pas utiliser ce script, puisque je ne lui en ai pas donnée. Du coup. :-(
Hop,
Moi.
[^] # Re: Mais pourquoi est-il aussi méchant ?
Posté par BFG . Évalué à 0.
Bien sûr, rien ne vous empêche de le faire, rien ne vous empêche non plus de nommer vos variables de façon volontairement incompréhensible (je ne dis pas que vous l'avez fait, c'est un exemple), ou autre chose désagréable.
Cependant, on attend généralement d'une réponse de forum qu'elle aide, qu'elle apprenne quelque chose, ou qu'elle ne soit pas volontairement contraignante sur la façon de s'en servir (là, par contre, la licence est une contrainte volontaire).
Alors, bien sûr, ce programme commence à devenir élaboré par rapport au premier message, et n'est pas les bouts de code le précédant, dont on peut encore se servir sans contrainte de licence, et ainsi faire soi-même son programme sans GPL.
Cette partie est complètement inutile.
Aucun message de forum répondant à une demande d'aide sur un code, n'a jamais eu de licence autorisant explicitement son utilisation. C'est tacite et accepté par tout le monde. A-t-on vu un jour une plainte "Mon message de forum a été utilisé alors que je n'avais pas mis de licence donc mon mon droit d'auteur est violé" ?
[^] # Re: Mais pourquoi est-il aussi méchant ?
Posté par ymorin . Évalué à 1.
En théorie, c'est tout à fait possible. OK, je dis bien en théorie . Et en spécifiant la licence, je lui impose certes des devoirs, mais aussi, et surtout, je lui octroie explicitement des droits. Ce n'est peut-être pas la licence qui te plait le plus ; c'est celle de mon choix. Tant pis si elle ne te plaît pas. Tant pis si elle ne lui plaît pas.
Et puis, franchement, que peut donc imposer la GPLv2 à un script shell ? Aucun binaire n'est généré.
Hop,
Moi.
[^] # Re: Mais pourquoi est-il aussi méchant ?
Posté par BFG . Évalué à 1.
...
Là, vous marquez un point.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.