#1 Le 18/07/2011, à 14:06
- yeKcim
zenity : processus père/fils, fifo,…
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 ?
Participer à un projet libre est un jeu... Et toi, à quoi tu joues ?
http://yeknan.free.fr
Hors ligne
#2 Le 18/07/2011, à 15:46
- AnsuzPeorth
Re : zenity : processus père/fils, fifo,…
Bjr,
Lorsqu'un bloc d'instruction est entre des parenthèses, il s'execute dans son propre environnement (un sous shell), donc les variables ne sont pas accessibles.
Pour que les variables chargées dans un bloc soient accessibles, il faut entourer d'accolades.
{
bloc de code
}
D'autres t'expliqueront surement mieux que moi
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#3 Le 18/07/2011, à 16:36
- yeKcim
Re : zenity : processus père/fils, fifo,…
Merci d'avoir pris du temps pour regarder mon problème. J'ai tenté
{ var=$RANDOM
echo "25" ; echo "# La variable est $var"; sleep 1
echo "100"
} | zenity --progress --title="Test" --text="progression..." --percentage=0
echo $var
Mais ca ne fonctionne pas mieux
Dernière modification par yeKcim (Le 18/07/2011, à 16:38)
Participer à un projet libre est un jeu... Et toi, à quoi tu joues ?
http://yeknan.free.fr
Hors ligne
#4 Le 18/07/2011, à 17:21
- AnsuzPeorth
Re : zenity : processus père/fils, fifo,…
Arff, suis con, c'est le pipe qui empêche la portée (enfin, si je dis pas encore des bêtises )
Ben dans ce cas, a part passer par un fichier pour stocker les données ... C'est le soucis avec bash et les sous processus.
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#5 Le 20/07/2011, à 09:31
- yeKcim
Re : zenity : processus père/fils, fifo,…
Au final j'ai trouvé une solution qui me convient avec un fichier texte. Dans le bout de code que j'écris, de toute façon, avoir un fichier supplémentaire est un avantage à plusieurs moments
{ var=$RANDOM
echo "25" ; echo "# La variable est $var"; sleep 1
echo "var=$var" >> fichier.txt
echo "100"
} | zenity --progress --title="Test" --text="progression..." --percentage=0
var=`cat fichier.txt|grep "var"|awk -F "=" '{print $2}'`
echo $var
Participer à un projet libre est un jeu... Et toi, à quoi tu joues ?
http://yeknan.free.fr
Hors ligne
#6 Le 20/07/2011, à 11:12
- AnsuzPeorth
Re : zenity : processus père/fils, fifo,…
Bjr,
Plutot que de faire un cat grep awk sur le fichier.
Si tu ne stocke qu'une seule variable dans ce fichier, mets y uniquement le contenu de la variable et pour le récup
~$ cat /home/fichier.txt
1
~$ var=$(< /home/fichier.txt)
~$ echo $var
1
Si tu y stocke plusieurs variable, du style var="données", source le fichier plutot.
~$ cat /home/fichier.txt
var1='1'
var2='2'
~$ . /home/fichier.txt
~$ echo $var1
1
~$ echo $var2
2
Une dernière petite chose, il faut éviter l'utilisation des ` et y préferer la forme $(), c'est déprécié.
Dernière modification par AnsuzPeorth (Le 20/07/2011, à 11:14)
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#7 Le 20/07/2011, à 11:31
- yeKcim
Re : zenity : processus père/fils, fifo,…
Génial, merci beaucoup pour ces 2 remarques, je débute plus ou moins dans l'écriture de script et je ne connaissais pas cette possibilité. ça va m'éviter des cat grep awk à la pelle.
Participer à un projet libre est un jeu... Et toi, à quoi tu joues ?
http://yeknan.free.fr
Hors ligne
#8 Le 20/07/2011, à 11:41
- FRUiT
Re : zenity : processus père/fils, fifo,…
surtout que grep et awk ne s'utilisent jamais en même temps, awk sachant très bien faire la même chose que grep :
var=`cat fichier.txt|grep "var"|awk -F "=" '{print $2}'`
var=$(awk -F "=" '/var/ {print $2}' fichier.txt)
Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
Hors ligne
#9 Le 20/07/2011, à 13:38
- UbuntOlivier
Re : zenity : processus père/fils, fifo,…
Bonjour,
Il me semble que si tu déclares tout simplement ta variable avant le bloc de code, elle sera reconnue aussi par le processus-fils :
var=$RANDOM
(
echo "25" ; echo "# C'est parti"
echo "50" ; echo "# La variable est $var"
echo "100" ; echo "# C'est fini $var"
) | zenity --progress --title="Test" --text="progression..." --percentage=0
echo $var
Hors ligne
#10 Le 20/07/2011, à 13:42
- johndo
Re : zenity : processus père/fils, fifo,…
@UbuntOlivier : non -> les modifications ne seront apportées que dans le processus fils
solution :
{
var=$RANDOM
echo "${var}"
} > >(zenity --progress --title="Test" --text="progression..." --percentage=0)
echo "${var}"
Dernière modification par johndo (Le 20/07/2011, à 13:42)
Hors ligne
#11 Le 20/07/2011, à 13:57
- frafa
Re : zenity : processus père/fils, fifo,…
Bonjour,
possible aussi sans pipe, en utilisant redirection.
#! /bin/bash
exec 3> >(zenity --progress --auto-close)
echo -e "10\n#Progresion 10%" >&3
sleep 1
echo -e "20\n#Progresion 20%" >&3
sleep 1
echo -e "30\n#Progresion 30%" >&3
sleep 1
echo -e "40\n#Progresion 40%" >&3
sleep 1
echo -e "50\n#Progresion 50%" >&3
sleep 1
echo -e "60\n#Progresion 60%" >&3
sleep 1
echo -e "70\n#Progresion 70%" >&3
sleep 1
echo -e "80\n#Progresion 80%" >&3
sleep 1
echo -e "90\n#Progresion 90%" >&3
sleep 1
echo -e "100\n#Progresion 100%, on ferme le progress" >&3
sleep 1
exit 0
Hors ligne
#12 Le 20/07/2011, à 14:00
- johndo
Re : zenity : processus père/fils, fifo,…
ce qui revient au même
Hors ligne
#13 Le 20/07/2011, à 14:06
- AnsuzPeorth
Re : zenity : processus père/fils, fifo,…
arff, tous des solutions que je connais et que j'utilise, mais auxquels je n'ai pas pensé, je dois avoir la tête ailleurs ...
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#14 Le 20/07/2011, à 14:33
- frafa
Re : zenity : processus père/fils, fifo,…
@johndo
je n'avait pas vu ton message, et oui ca reviens au même,
mais le petit plus en changeant de descripteur,
c'est que on ne recevra pas un message non souhaité d'une commande dans le progress.
Hors ligne