Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

redirection

22 réponses
Avatar
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

10 réponses

1 2 3
Avatar
Matthieu Moy
le pierre writes:

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

Avatar
le pierre
On 19 juin, 10:58, Matthieu Moy
wrote:
le pierre writes:
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 ?


Avatar
Matthieu Moy
le pierre writes:

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

Avatar
Vincent Lefevre
Dans l'article ,
le pierre écrit:

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 - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Avatar
le pierre
On 19 juin, 11:24, Vincent Lefevre <vincent+ wrote:
Dans l'article ,
le pierre écrit:

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 - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/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 !!!!


Avatar
Matthieu Moy
le pierre writes:

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

Avatar
le pierre
On 19 juin, 11:34, Matthieu Moy
wrote:
le pierre writes:
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.


Avatar
Matthieu Moy
le pierre writes:

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

Avatar
Vincent Lefevre
Dans l'article ,
le pierre écrit:

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 - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Avatar
Olivier Miakinen
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é.


<cit. guide-bourne-shell.pdf, 5.12.5, page 52>
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. [...]
</cit.>


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


1 2 3