Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 wink


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 smile)

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 :

yeKcim a écrit :

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 wink

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