redirection

Le
le pierre
Bonjour,

j'ai une boucle for en AIX (ksh) et je souhaite rediriger la sortie en
fonction des elements de ma liste :

typiquement :


export LISTE=a b c d e f

for i in $LISTE
do
echo "bonjour"
done > ${i}.log



voila en gros ce que je voudrais faire, mais ca !!ca ne marche pas,
pourquoi et que dois je faire ?


merci
Vos réponses Page 2 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Matthieu Moy
Le #738465
le pierre
Quelqu'un peut il me dire pourquoi quand je passe par une variable
intermediaire j'ai un decalage :

#! /bin/ksh

export LISTE_HOST="a b c d e"

export VAR
for HOST in $LISTE_HOST ; do {
VAR=$HOST
echo $VAR
} > ${VAR}.log
#}
done

le fichier a.log contient b idem pour b.log qui contient c

pourquoi ?


Regardes bien ton code. Regardes bien tes accolades. Quand est-ce que
la variable VAR est affectée, quand est-elle utilisée ?

--
Matthieu

le pierre
Le #738464
On 19 juin, 10:58, Matthieu Moy wrote:
le pierre
Quelqu'un peut il me dire pourquoi quand je passe par une variable
intermediaire j'ai un decalage :

#! /bin/ksh

export LISTE_HOST="a b c d e"

export VAR
for HOST in $LISTE_HOST ; do {
VAR=$HOST
echo $VAR
} > ${VAR}.log
#}
done

le fichier a.log contient b idem pour b.log qui contient c

pourquoi ?


Regardes bien ton code. Regardes bien tes accolades. Quand est-ce que
la variable VAR est affectée, quand est-elle utilisée ?

--
Matthieu


La variable VAR est declarée dans le bloc, et je l'utilise a
l'exterieur du bloc, c'est ca le pb mais comment faire ?


Matthieu Moy
Le #759082
le pierre
La variable VAR est declarée dans le bloc, et je l'utilise a
l'exterieur du bloc, c'est ca le pb mais comment faire ?


En particulier, le shell voit

{...} > ${VAR}...

il doit créer le fichier, positionner les redirections avant d'avoir
exécuté le contenu du bloc.

Si le problème est que la variable est affectée dans le bloc, je crois
qu'on n'est pas très loin de la solution, non ?

--
Matthieu

Vincent Lefevre
Le #759081
Dans l'article le pierre
La variable VAR est declar?e dans le bloc, et je l'utilise a
l'exterieur du bloc, c'est ca le pb mais comment faire ?


La déclarer à l'extérieur du bloc:

for HOST in $LISTE_HOST
do
VAR=$HOST
{
echo $VAR
} > ${VAR}.log
done

--
Vincent Lefèvre 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

le pierre
Le #759080
On 19 juin, 11:24, Vincent Lefevre
Dans l'article le pierre
La variable VAR est declar?e dans le bloc, et je l'utilise a
l'exterieur du bloc, c'est ca le pb mais comment faire ?


La déclarer à l'extérieur du bloc:

for HOST in $LISTE_HOST
do
VAR=$HOST
{
echo $VAR
} > ${VAR}.log
done

--
Vincent Lefèvre 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


c'est ce que j'ai cru faire en faisant export VAR avant le for !!!!


Matthieu Moy
Le #758777
le pierre
c'est ce que j'ai cru faire en faisant export VAR avant le for !!!!


Ne le prends pas mal, mais si tu veux coder correctement en shell, il
va falloir lire une bonne doc. Par exemple :

http://ploug.eu.org/doc/guide-bourne-shell.pdf

En y allant par essai-erreur, tu vas galérer pour arriver à un
résultat plutôt médiocre.

--
Matthieu

le pierre
Le #758776
On 19 juin, 11:34, Matthieu Moy wrote:
le pierre
c'est ce que j'ai cru faire en faisant export VAR avant le for !!!!


Ne le prends pas mal, mais si tu veux coder correctement en shell, il
va falloir lire une bonne doc. Par exemple :

http://ploug.eu.org/doc/guide-bourne-shell.pdf

En y allant par essai-erreur, tu vas galérer pour arriver à un
résultat plutôt médiocre.

--
Matthieu


tu as raison, mais la j'avais un script a faire rapidos pour
sauvegarder des backups systemes.


Matthieu Moy
Le #758775
le pierre
tu as raison, mais la j'avais un script a faire rapidos pour
sauvegarder des backups systemes.


Bah, c'est le genre de chose que je ne ferais pas « rapidos »,
justement. C'est un coup à avoir des backups foireux, et à ne s'en
rendre compte que trop tard ...

--
Matthieu

Vincent Lefevre
Le #758774
Dans l'article le pierre
tu as raison, mais la j'avais un script a faire rapidos pour
sauvegarder des backups systemes.


Note que Perl peut être préférable (e.g. si tu dois gérer des timeout,
car les traps sont trop mal foutus en shell POSIX).

--
Vincent Lefèvre 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Olivier Miakinen
Le #758450
Le 19/06/2007 03:57, Vincent Lefevre me répondait :

Tiens ? Je connaissais les parenthèses mais pas les accolades.


Les parenthèses, ça exécute un sous-shell, donc qui a un environnement
différent, et les effets secondaires éventuels (e.g. modification de
variable ou du répertoire de travail courant) ne seront pas visibles
dans le parent. Dans le cas général, l'utilisation des accolades est
la solution correcte.


Je suis en train de lire la doc indiquée par Matthieu Moy :
http://ploug.eu.org/doc/guide-bourne-shell.pdf

Cette doc date de 1991, soit seulement 3 ou 4 ans après que j'ai appris
à me servir du shell. Il n'est pas question des accolades, ce qui
explique probablement pourquoi je ne connaissais que les parenthèses
(ça n'existait peut-être pas dans les shells de l'époque). En revanche,
une petite phrase concernant les instructions de contrôle devrait à mon
avis s'appliquer aussi aux accolades, et faire qu'en l'occurrence il n'y
aurait aucune différence entre les deux dans l'exemple donné.


5.12.5 Attention

Quand on redirige ou que l'on pipe [sic] les entrées-sorties ou que l'on
met dans l'arrière plan une telle structure, celle-ci est exécutée dans
un sous-shell. [...]


Donc, si ce que je suppose est vrai,
{ ... } > ${i}.log
est équivalent à
( ... ) > ${i}.log
à cause de la redirection de stdout vers un fichier.


Publicité
Poster une réponse
Anonyme