#1 Le 28/07/2013, à 17:04
- Compte supprimé
[Résolu] Bash exporter variable fils à son père
Bonjour la communauté,
Voici un extrait de script...
titres="1 2"
for i in $titres
do
vamps -e 1 -a 01 -s 02 < "/home/slyfox/Bureau/video-Titre-$i.vob" > "/home/slyfox/Bureau/video-Titre-$i.mpg" &
pid=$!
echo "$pid" > /home/slyfox/Bureau/pid.txt
while [[ ! -z "$(pidof vamps | grep "$pid")" ]]
do
pourcentZenity=$(commande calculant le pour-cent de la nouvelle vidéo copiée)
echo "$pourcentZenity" #Renvoi cette valeur du pourcentage à la boite zenity
done
done | zenity --progress --auto-close
if [[ "${PIPESTATUS[1]}" != "0" ]]
then
pid=$(</home/slyfox/Bureau/pid.txt)
kill "$pid"
fi
Petite explication...
Vamps (programme qui permet de réduire une video) est lancé en arrière plan... je récupère son pid qui est utile pour tuer Vamps si je ferme la fenêtre zenity.
La boucle while me calcule le pourcentage de l'avancement de la nouvelle vidéo... que je renvoie à Zenity pour la barre de progression.
Ma question... La seule manière que j'ai trouvé pour récupérer la variable "pid" et de passer par un fichier... Il y a t’il une autre manière de procéder sans passer par un fichier pour récupérer la variable "pid" ???
Amicalement Slyfox
Dernière modification par Compte supprimé (Le 29/07/2013, à 21:56)
#2 Le 29/07/2013, à 09:01
- tiramiseb
Re : [Résolu] Bash exporter variable fils à son père
Salut,
À ma connaissance, un processus fils ne peut pas "passer" une variable à son père.
Maintenant, ce que je ne comprends pas par rapport à ton script c'est que là tu es toujours dans le même script, il n'y a ni père ni fils...
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#3 Le 29/07/2013, à 11:04
- Bigcake
Re : [Résolu] Bash exporter variable fils à son père
Bonjour
Je ne sait pas comment tu lance tout ton truc mais en faisant un 'echo $pid', et en utilisant une redirection '|' ou '<', dans la ligne de commande, est-ce que ça te conviendrai ?
Dernière modification par Bigcake (Le 29/07/2013, à 11:06)
"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5
Hors ligne
#4 Le 29/07/2013, à 11:08
- Compte supprimé
Re : [Résolu] Bash exporter variable fils à son père
Maintenant, ce que je ne comprends pas par rapport à ton script c'est que là tu es toujours dans le même script, il n'y a ni père ni fils...
euh ? là tu me mets le doute ??? le script en lui même est le père... sauf la ligne avec "vamp..." qui contient à la fin le fameux "&" qui doit-être le fils ... non ?
Merci de m'expliquer... quelque chose doit d’échapper ?
Amicalement Slyfox
Dernière modification par Compte supprimé (Le 29/07/2013, à 11:08)
#5 Le 29/07/2013, à 11:19
- tiramiseb
Re : [Résolu] Bash exporter variable fils à son père
Le fils, c'est uniquement l'exécutable "vamp". Ce n'est pas "la ligne avec vamp".
La variable "pid", dont la valeur est configurée par la ligne "pid=$!", est lisible en dehors de la boucle for : tu n'as pas besoin de passer par le fichier /home/slyfox/Bureau/test.txt.
Ou alors j'ai mal compris ton besoin.
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#6 Le 29/07/2013, à 11:29
- Bigcake
Re : [Résolu] Bash exporter variable fils à son père
ah bah oui, d'accord j'avais pas compris, en fait, mais effectivement je 'plussoie' totalement avec ce que vient d'écrire tiramiseb
"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5
Hors ligne
#7 Le 29/07/2013, à 12:24
- Compte supprimé
Re : [Résolu] Bash exporter variable fils à son père
Le fils, c'est uniquement l'exécutable "vamp". Ce n'est pas "la ligne avec vamp".
La variable "pid", dont la valeur est configurée par la ligne "pid=$!", est lisible en dehors de la boucle for : tu n'as pas besoin de passer par le fichier /home/slyfox/Bureau/test.txt.
Ou alors j'ai mal compris ton besoin.
C'est bien là le problème $pid se fait "bouffer" par Zenity mais si je suipprime "| zenity --progress --auto-close" cela fonctionne... je peux récupérer le "$pid"
Dernière modification par Compte supprimé (Le 29/07/2013, à 12:24)
#8 Le 29/07/2013, à 12:36
- Watael
Re : [Résolu] Bash exporter variable fils à son père
oh! le sournois pipe caché
salut,
ajoute l'instruction
shopt -s lastpipe
au début de ton script.
cela permet aux variables définies dans un pipe, qui normalement ne sont pas accessibles en dehors du sous-shell que crée un pipe, d'être accessibles au shell en cours.
Dernière modification par Watael (Le 29/07/2013, à 13:00)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 29/07/2013, à 13:02
- Bigcake
Re : [Résolu] Bash exporter variable fils à son père
Sinon tu déclares ta variable pid avant la boucle :
pid=0
for i in $titres
[...]
Dernière modification par Bigcake (Le 29/07/2013, à 13:02)
"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5
Hors ligne
#10 Le 29/07/2013, à 17:30
- Compte supprimé
Re : [Résolu] Bash exporter variable fils à son père
@ Watael
Salut,
Si je fais ...
titres="1 2"
shopt -s lastpipe
for i in $titres
do
vamps -e 1 -a 01 -s 02 < "/home/slyfox/Bureau/video-Titre-$i.vob" > "/home/slyfox/Bureau/video-Titre-$i.mpg" &
pid=$!
while [[ ! -z "$(pidof vamps | grep "$pid")" ]]
do
pourcentZenity=$(commande calculant le pour-cent de la nouvelle vidéo copiée)
echo "$pourcentZenity" #Renvoi cette valeur du pourcentage à la boite zenity
done
done | zenity --progress --auto-close
if [[ "${PIPESTATUS[1]}" != "0" ]]
then
kill "$pid"
fi
echo "$pid"
le dernier "echo $pid" est vide...
@ Bigcake
Je ne peux pas déclarer $pid avant la boucle... car le pid récupère le numéro de processus de "vamps" qui est lancer en arrière plan... en plus il me sert à tuer "vamps" en cas de fermeture de Zenity.
Amicalement Slyfox
Dernière modification par Compte supprimé (Le 29/07/2013, à 22:02)
#11 Le 29/07/2013, à 17:31
- Haleth
Re : [Résolu] Bash exporter variable fils à son père
Déclaration, affectation, c'est pas vraiment la même chose, hein ?
Ubuntu is an ancien African word which means "I can't configure Debian"
Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.
Hors ligne
#12 Le 29/07/2013, à 17:33
- tiramiseb
Re : [Résolu] Bash exporter variable fils à son père
Déclaration, affectation, c'est pas vraiment la même chose, hein ?
Et même... il peut toujours affecter "0" à la variable pid, c'est faux de dire que c'est impossible.
La bonne valeur sera simplement affectée plus tard :-)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#13 Le 29/07/2013, à 17:36
- Compte supprimé
Re : [Résolu] Bash exporter variable fils à son père
@ tiramiseb
.. pas faux !!!
Mais dans le cas présent cela m'aide pas trop... quoi que c'est mieux d’initialiser les variable avant utilisation ... on ne sais jamais
Excuses moi... d'avoir mal compris...
Amicalement Slyfox
Dernière modification par Compte supprimé (Le 29/07/2013, à 17:39)
#14 Le 29/07/2013, à 17:38
- tiramiseb
Re : [Résolu] Bash exporter variable fils à son père
dans le cas présent cela m'aide pas trop... quoi que c'est mieux de l’initialiser... on ne sais jamais
La théorie de Bigcake est que, si la variable est déclarée avant la boucle for, sa valeur sera conservée.
Je ne sais pas si ça fonctionne comme ça avec Bash, je n'ai pas vérifié.
Mais ça ne coûte rien d'essayer.
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#15 Le 29/07/2013, à 17:41
- Compte supprimé
Re : [Résolu] Bash exporter variable fils à son père
@tiramiseb
Je viens d'essayer de rajouter "pid="0" au début du script... il me retourne "0" au dernier echo...
titres="1 2"
pid="0"
shopt -s lastpipe
for i in $titres
do
vamps -e 1 -a 01 -s 02 < "/home/slyfox/Bureau/video-Titre-$i.vob" > "/home/slyfox/Bureau/video-Titre-$i.mpg" &
pid=$!
while [[ ! -z "$(pidof vamps | grep "$pid")" ]]
do
pourcentZenity=$(commande calculant le pour-cent de la nouvelle vidéo copiée)
echo "$pourcentZenity" #Renvoi cette valeur du pourcentage à la boite zenity
done
done | zenity --progress --auto-close
if [[ "${PIPESTATUS[1]}" != "0" ]]
then
kill "$pid" #vamps n'est pas tué
fi
echo "$pid"
Amicalement Slyfox
Dernière modification par Compte supprimé (Le 29/07/2013, à 17:45)
#16 Le 29/07/2013, à 17:45
- Zakhar
Re : [Résolu] Bash exporter variable fils à son père
Et pour répondre à la question initiale, non, il n'y a pas d'autre moyen de passer une info d'un fils à son père que via un fichier.
Après il y probablement des moyens détournés : pipes nommés, faire un netcat... mais tout ça, sous Linux, ce sont de toute façon des fichiers, donc la boucle est bouclée !..
Bien sûr, si c'est une info que le père connaît déjà (PID), c'est superflu (sauf peut-être dans ton cas à cause de zenity qui "bouffe" peut-être le PID).
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#17 Le 29/07/2013, à 19:35
- Watael
Re : [Résolu] Bash exporter variable fils à son père
ok, j'avais mal compris : les deux parties d'un pipe sont exécutées dans un sous-shell.
Ici, lastpipe n'y fera rien, puisque l'assignation se fait dans la première partie du pipe
je ne vois pas d'autre choix : ce sera fichier!
Dernière modification par Watael (Le 29/07/2013, à 19:45)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#18 Le 29/07/2013, à 21:50
- Compte supprimé
Re : [Résolu] Bash exporter variable fils à son père
@Zakhar
Merci ! tu m'as mis sur la voie avec le pipes nommés (fifo). J'ai fais une recherche sur le net et je suis tombé sur cette page http://linuxfr.org/forums/programmation-shell/posts/zenity-processus (poste du 19/07/11 à 15:11) que j'ai adapté à mon script... et là ça fonctionne, je peux récupéré ma variable "$pid"
titres="1 2"
pid="0"
fifo=$(mktemp -u)
mkfifo $fifo
zenity --progress --auto-close 2>/dev/null <"${fifo}" &
progress_pid="${!}"
exec 6>&1 # Save stdout
exec >"${fifo}" # Redirect stdout to the fifo
for i in $titres
do
vamps -e 1 -a 01 -s 02 < "/home/slyfox/Bureau/video-Titre-$i.vob" > "/home/slyfox/Bureau/video-Titre-$i.mpg" &
pid=$!
while [[ ! -z "$(pidof vamps | grep "$pid")" ]]
do
pourcentZenity=$(commande calculant le pour-cent de la nouvelle vidéo copiée)
echo "$pourcentZenity" #Renvoi cette valeur du pourcentage à la boite zenity
done
done
exec >&6 # Restore stdout
kill "${progress_pid}"
echo "$pid"
Mais perso je préfère quand même l'utilisation d'un fichier comme mon premier poste... c'est plus simple à mettre en place et plus compréhensible en tout cas pour moi.
donc pour moi ce sujet est résolu...
Merci à tous pour votre aide et le partage !!!
Amicalement Slyfox
NB : Je vais quand même analysé ce dernier script, il y a certainement des choses à apprendre au cas ou...
Dernière modification par Compte supprimé (Le 29/07/2013, à 21:53)
#19 Le 29/07/2013, à 22:29
- Watael
Re : [Résolu] Bash exporter variable fils à son père
avec coproc:
#!/bin/bash
coproc zenity --progress --auto-close
for i in $titres
do
vamps -e 1 -a 01 -s 02 < "/home/slyfox/Bureau/video-Titre-$i.vob" > "/home/slyfox/Bureau/video-Titre-$i.mpg" &
pid=$!
while [[ ! -z "$(pidof vamps | grep "$pid")" ]]
do
pourcentZenity=$(commande calculant le pour-cent de la nouvelle vidéo copiée)
echo "$pourcentZenity" #Renvoi cette valeur du pourcentage à la boite zenity
done
done >&${COPROC[1]}
kill "${COPROC_PID}"
echo "$pid"
Dernière modification par Watael (Le 29/07/2013, à 22:29)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#20 Le 29/07/2013, à 23:49
- Zakhar
Re : [Résolu] Bash exporter variable fils à son père
Mais perso je préfère quand même l'utilisation d'un fichier comme mon premier poste... c'est plus simple à mettre en place et plus compréhensible en tout cas pour moi.
donc pour moi ce sujet est résolu...
Tout à fait d'accord avec ça.
C'est d'ailleurs une technique bien connue qui s'appelle KISS (Keep It Simple Stupid). Parce que un truc simple est largement plus facile à maintenir... ce qui est important en shell vu la maintenabilité assez faible !..
Et comme je le disais aussi plus haut, de toute façon, vu de Linux, un pipe nommé est un fichier, et ça ne change donc pas grand chose que tu fasses un fichier "standard". La seule différence est que le pipe nommé, le kernel va tâcher de le garder en mémoire, mais si tu as monté ton /tmp en RAM ou tu mets ton fichier dans /dev/shm (monté en RAM par défaut), ça va vraiment être tout proche du pipe nommé !..
En fait tu as une seule différence significative ici, c'est que ton shell n'est pas "parallélisable".
Vu que tu as pris un nom de fichier fixe pour échanger les informations, si tu lances deux fois le shell en parallèle sur deux fichiers différents que tu veux traiter en même temps, tu as des risques d'écrasement.
Tu peux facilement améliorer ça en utilisant mktemp qui va te créer un fichier temporaire avec un nom unique. C'est d'ailleurs une bonne pratique de faire ainsi lorsque tu fais des fichiers temporaires.
Dernière modification par Zakhar (Le 29/07/2013, à 23:54)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#21 Le 30/07/2013, à 11:08
- Compte supprimé
Re : [Résolu] Bash exporter variable fils à son père
@ Zakhar
Merci pour ce complément d'info !
Surtout le mktemp... commande que je ne connaissez pas... et qui va me simplifié un peu la vie.
Amicalement Slyfox