Votre navigateur est obsolète. Téléchargez un navigateur moderne, par exemple FireFox.
Léa-Linux : Forum
Le forum de Léa abrite des discussions autour des Logiciels libres.
Syndication
  • RSS ForumForum complet
  • RSS Forum - DéveloppementForum - Développement
  • RSS Forum - Développement - 321098Cette discussion

Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Important : quand vous posez une question, n'oubliez pas de nous donner les indications suffisantes pour que nous puissions répondre. En effet, la divination n'est pas le fort du Linuxien averti. Pour une meilleure compréhension, le bon usage de la grammaire et de l'orthographe est fortement encouragé. En particulier, le langage SMS est à éviter absolument. En cas d'abus, il pourra être censuré sans autre forme de procès.
Les messages dont le contenu est illégal (incitant à la haine - raciale ou autre, diffamant), ou dont le contenu est sans rapport avec le sujet du forum, ou qui sont parfaitement stupides ou hors sujet seront supprimés sans pitié. Il pourra même être fait appel au fournisseur d'accès du coupable pour faire cesser ses agissements.
» Index du forum » Développement » Encore une basherie
Aller à la discussion: PrécédentSuivante
Action: Nouveau sujetChercherS'authentifier
Encore une basherie
Avatar
Auteur: Fanch (IP enregistrée)
Date: le 17 avril 2007 à 11:22

Bah à moi aussi bash fait des misères ; quelqu'un serait-il en mesure de m'expliquer ça :

VAR="AAA"

ls | while read rep
do 
  VAR=${rep}
  echo "Dans le while : ${VAR}"
done

echo "Hors while : ${VAR}


et ça me répond :
Dans le while : rep1
Dans le while : rep2
Hors while : AAA


pourquoi VAR n'a pas gardé sa dernière valeur, à savoir rep2 ????? image : confus
m'enfin ?!

------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Re: Encore une basherie
Avatar
Auteur: Fanch (IP enregistrée)
Date: le 17 avril 2007 à 11:30

Je deviens chèvre :

VAR="AAA"
for rep in `ls`
do
  VAR=${rep}
  echo "Dans le for : ${VAR}"
done

echo "Hors for : ${VAR}


ça répond :
Dans le for : rep1
Dans le for : rep2
Hors for : rep2


aga aga agaga image : fouimage : fouimage : fou
un problème de pipe ?

------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Re: Encore une basherie
Auteur: Mochi-Mochi (IP enregistrée)
Date: le 17 avril 2007 à 12:45

Salut,

Tout simplement parce que man bash. image : tcontent

Lorsque tu fais un pipe, chaque branche du pipe s'exécute dans un sous-shell et balance sa sortie à la commande suivante. Donc ton while est dans un sous-shell et tout ce qui s'y fait n'affecte pas pas le shell-père.

C'est comme si tu faisais :

VAR="AAA"
for rep in `ls`
do
(
  VAR=${rep}
  echo "Dans le for : ${VAR}"
)
done

echo "Hors for : ${VAR}


Si tu veux t'en convaincre, regarde le nombre de processus sh qui tournent selon qu'on est dans la boucle ou pas :
VAR="AAA"
ps -C sh
ls | while read rep
do
  VAR=${rep}
  echo "Dans le while : ${VAR}"
ps -C sh
done

echo "Hors while : ${VAR}"
ps -C sh



Re: Encore une basherie
Avatar
Auteur: Fanch (IP enregistrée)
Date: le 17 avril 2007 à 15:02

c'est bien ce que j'avais suspecté ; mais du coup c'est grave pénible parce que c'est impossible d'utiliser une structure while pour faire ce genre de magouille.

rhalala ! tout ça, ça vaut pas un bon script python !!!

------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Re: Encore une basherie
Avatar
Auteur: oudoubah (IP enregistrée)
Date: le 17 avril 2007 à 15:10

Fanch a écrit :

c'est bien ce que j'avais suspecté ; mais du coup
c'est grave pénible parce que c'est impossible
d'utiliser une structure while pour faire ce genre
de magouille.

rhalala ! tout ça, ça vaut pas un bon script
python !!!


D'où la commande export :
#!/bin/sh

VAR="AAA"
for rep in `ls`
do
  VAR=${rep}
  echo "Dans le for : ${VAR}"
        export VAR
done

echo "Hors for : ${VAR}"


Ah! Rien ne vaut un bon script bash! image : tcontent

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Re: Encore une basherie
Avatar
Auteur: Fanch (IP enregistrée)
Date: le 17 avril 2007 à 16:58

Non non ! ça ne vaudrait que si tu faisais un ls | while ... sinon, ça marche déjà (l'export sert à rien) !

tricheur ! image : clinlangue



------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Re: Encore une basherie
Auteur: Mochi-Mochi (IP enregistrée)
Date: le 17 avril 2007 à 18:11

Non, a priori le patriarcat est de mise en shell : c'est impossible de modifier les définitions du shell-père avec celles d'un fils. C'est un peu normal, puisque tu as un sous processus, c'est comme si tu faisais un appel système sur un script python à partir d'un autre script python, j'imagine que tu ne serais pas très heureux si les variables de l'un et de l'autre partageaient le même espace de nom. image: clin d`oeil

Après, pour utiliser "| while read" en influeant sur le père, tu peux ruser mais ça dépend ce que tu veux faire... dans l'exemple donné ça n'apporterait rien que des complications.

Re: Encore une basherie
Avatar
Auteur: Fanch (IP enregistrée)
Date: le 17 avril 2007 à 21:06

bah en fait ça met en évidence que je ne sais pas travailler avec les références des variables en bash (comme avec des pointeurs en C/C++).
Mais bon, je me formalise pas plus que ça image : tcontent , bash ne fait pas partie des éléments pour lesquels je suis "tenu" de faire du code propre image : flue

------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Re: Encore une basherie
Avatar
Auteur: oudoubah (IP enregistrée)
Date: le 17 avril 2007 à 22:23

Pour les pointeurs bash, (c'est pas du C, hein!), voici un exemple :
#!/bin/sh

VAR="AAA"
pointeur=VAR

echo ${VAR}
echo ${!pointeur}


Sinon, pour ton problème, il te faut passer soit par un fichier, soit par des descripteurs de fichiers (style stdout, mais en créer un autre pour).
A avoir des variables qui puissent changer dans des sous-shell, j'utiliserai un fichier contenant les variables, que je modifierais à coup de sed (soyons bourrin), et que je "sourcerais" à chaque fois après les appels aux sous-shell qui modifient les variables.

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Re: Encore une basherie
Auteur: chromosome (IP enregistrée)
Date: le 18 avril 2007 à 00:00

Il faut faire ca :

VAR="AAA"

ls | ( while read rep
do 
  VAR=${rep}
  echo "Dans le while : ${VAR}"
done

echo "Hors while : ${VAR}"
)


Avec des parenthèses

Re: Encore une basherie
Avatar
Auteur: Fanch (IP enregistrée)
Date: le 18 avril 2007 à 00:13

oudoubah a écrit :

A avoir des variables qui puissent changer dans des sous-shell, j'utiliserai un fichier contenant les variables, que je modifierais à coup de sed
(soyons bourrin), et que je "sourcerais" à chaque fois après les appels aux sous-shell qui modifient les variables.

ah pas con ! mais bon, c'est un peu lourdingue aussi donc je vais rester sur le for. Merci pour le ${!pointeur} ! image : content

chromosome a écrit :


Avec des parenthèses

ouais d'accord mais bon, tu ne fais que déplacer le problème en intégrant l'ultime echo dans le sous-shell généré par le pipe. Dans mon vrai script, le dernier echo c'est 1400 lignes ... (je porte du dcl d'openvms vers bash et j'ai pas fondamentalement le temps de reprendre la structure des scripts).


------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Re: Encore une basherie
Avatar
Auteur: Sve@r (IP enregistrée)
Date: le 18 avril 2007 à 14:23

Fanch a écrit :

ouais d'accord mais bon, tu ne fais que déplacer
le problème en intégrant l'ultime echo dans le
sous-shell généré par le pipe. Dans mon vrai
script, le dernier echo c'est 1400 lignes


Pas de problème même avec 1400 lignes d'écart

#!/bin/sh

work()
{
    (
        ls | (
                while read ligne
                do
                       <.... traitement de $ligne ....>
                done
                echo "le truc final qu'il faut afficher"
              )
     )
}

<... travail normal de 1400 ligne ...>
work

# ou bien

resultat=`work`

# Fin du script


L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]



Nom du forum : (antispam) - (en développement:saisir un texte pour le message, rempli cette zone automatiquement)
Votre nom: 
Votre email: 
Sujet: 

 
Ce forum est boosté par Phorum.