[RESOLU] [Shell] question de laisse

question de laisse [RESOLU] [Shell] - Shell/Batch - Programmation

Marsh Posté le 22-06-2006 à 17:47:04    

J'ai une question bête, et je cherche une solution ... qui ne me viens pas:
Dans un de mes shell je liste les fichiers d'un repertoire, et j'effectue un traitmement:  
 

Code :
  1. for ligne in `ls `
  2. do
  3. echo $ligne
  4. done


 
là sa marche on a la liste des fichiers
 
Mais, si un fichier contient un espace par exemple "fichier con.txt" ... sa me fera deux lignes.  
Avez vous une solution élegante, simplissime, pour l'avoir sur une seule ligne ?

Message cité 1 fois
Message édité par youx21 le 23-06-2006 à 09:53:57
Reply

Marsh Posté le 22-06-2006 à 17:47:04   

Reply

Marsh Posté le 22-06-2006 à 20:16:35    

youx21 a écrit :

Mais, si un fichier contient un espace par exemple "fichier con.txt" ... sa me fera deux lignes.


Evidemment, "for" utilise l'espace pour séparer ses éléments !!!
 

youx21 a écrit :

Avez vous une solution élegante, simplissime, pour l'avoir sur une seule ligne ?


Le "read" utilise le "return" pour séparer ses éléments... et renvoie "faux" quand il ne lit plus rien. D'où la solution élégante et simplissime suivante :

ls |while read ligne
do
    echo $ligne
done


 
Seul danger: si tu implémentes une variable dans la boucle (style un compteur), elle est perdue à la fin du "done" (hé oui, pipe => nouveau processus). Il y a des moyens élégants mais moins simplissimes de pallier à ce problème...

Message cité 1 fois
Message édité par Sve@r le 22-06-2006 à 20:48:18

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 23-06-2006 à 09:53:02    


arglll... trop facile... je la met de côté celle-là...

Reply

Marsh Posté le 23-06-2006 à 14:07:02    

Sve@r a écrit :


Seul danger: si tu implémentes une variable dans la boucle (style un compteur), elle est perdue à la fin du "done" (hé oui, pipe => nouveau processus). Il y a des moyens élégants mais moins simplissimes de pallier à ce problème...


 
 
je viens de faire le test, voici mon code
 

Code :
  1. TOTO=sdfgsfd
  2. ls /tmp | while read lin
  3. do
  4.         echo $lin
  5.         TOTO=ttttttttttt
  6. done
  7. echo "TOTO=$TOTO"


 
et bien ca me renvoie ttttttttttt sous AIX 3 5    et    HP-UX B.11.00 U
et sdfgsfd sous Cygwin  
 
c'est en contradiction avec ce que tu dis, malgré que je comprend tout a fait ton raisonnement,
 
et ca m'interpelle ............ :-(
 
d'ailleurs je suis persuadé que j'avais ce probleme sur HP il y a 10 sur une plus vielle version donc ....
 
 
 
qu'en penses tu ?

Reply

Marsh Posté le 23-06-2006 à 15:43:25    

tiens, j'avais tellement confiance au code que je me l'etait mis de coté... et puis je viens de verifier, sous mon sh [debian/sarge] sa roule. j'ai pas d'autre environnement pour le tester à l'instant. ça serais une spécificité là dessus, ou une implentation d'une certaines normes (que je ne connais pas) ???

Reply

Marsh Posté le 23-06-2006 à 16:36:48    

j'ai pas saisi comment ca reagit sur sarge, tu as "sdgfdfgsdf" ou "tttttttt" ?

Reply

Marsh Posté le 23-06-2006 à 16:43:45    

gloo a écrit :

j'ai pas saisi comment ca reagit sur sarge, tu as "sdgfdfgsdf" ou "tttttttt" ?


oups, j'ai "sdgfdfgsdf"  
 
comme pour cyg... un linux quoi ;) pour moi c'est sans doute des subtilités des shell


Message édité par youx21 le 23-06-2006 à 16:44:32
Reply

Marsh Posté le 23-06-2006 à 16:57:31    

gloo a écrit :

je viens de faire le test, voici mon code
 

Code :
  1. TOTO=sdfgsfd
  2. ls /tmp | while read lin
  3. do
  4.         echo $lin
  5.         TOTO=ttttttttttt
  6. done
  7. echo "TOTO=$TOTO"


 
et bien ca me renvoie ttttttttttt sous AIX 3 5    et    HP-UX B.11.00 U
et sdfgsfd sous Cygwin  
 
c'est en contradiction avec ce que tu dis, malgré que je comprend tout a fait ton raisonnement,
 
et ca m'interpelle ............ :-(
 
d'ailleurs je suis persuadé que j'avais ce probleme sur HP il y a 10 sur une plus vielle version donc ....


 
Je suis HYPER heureux que t'aies testé. Parce que j'ai testé ce genre de code dans différents shells et j'ai remarqué qu'en ksh, on a effectivement remontée de la valeur (à moins qu'il n'y ait pas de sous-processus).
Mais dans les autres Bourne shells (sh, bash), TOTO sera vide.
 
J'avais déjà posé la question sur des forums Unix mais j'ai jamais eu de vraie réponse expliquant la raison de cette différence en ksh
 
Mais c'est bien de tester des trucs comme ça. Ca montre qu'on est "aware" :D  


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 23-06-2006 à 17:28:15    

qq tests :
 
a votre avis, qu'affiche ceci :
 

Code :
  1. toto=A
  2. toto=B   2>&1 | tee log.txt
  3. echo $toto


 
et bien ca affiche "A"  !!!! meme sur mon AIX (en ksh) !!!
donc effectivement, on a logiquement 2 processus fils et on perd la nouvelle affectation de toto.
 
test N°2 :

Code :
  1. toto=A
  2. toto=B | while read line ; do echo blabla ; done
  3. echo $toto


le resultat est "A" sur AIX (en ksh) et cygwin
 
test N°3 :

Code :
  1. toto=A
  2. echo xxx  | while read line ; do toto=B ; done
  3. echo $toto


 
ca repond "A" en cygwin et en bsh sous AIX
et B en AIX (ksh ,sh, tsh)
 
 
c'estquand meme delirant, considerons le ksh du AIX : si l'affectation est au debut (test 2) je la perds, et si l'affectation est dans le do/done du while (test 3) je la conserve !!!!!!
 
Franchement, j'aimerais bien avoir une explication... je ne sais pas ou la chercher .....
 
et ben c est un beau bordel....

Message cité 1 fois
Message édité par gloo le 23-06-2006 à 17:32:07
Reply

Marsh Posté le 23-06-2006 à 19:34:32    

gloo a écrit :

qq tests :
 
a votre avis, qu'affiche ceci :
 

Code :
  1. toto=A
  2. toto=B   2>&1 | tee log.txt
  3. echo $toto


 
et bien ca affiche "A"  !!!! meme sur mon AIX (en ksh) !!!
donc effectivement, on a logiquement 2 processus fils et on perd la nouvelle affectation de toto.
 
test N°2 :

Code :
  1. toto=A
  2. toto=B | while read line ; do echo blabla ; done
  3. echo $toto


le resultat est "A" sur AIX (en ksh) et cygwin
 
test N°3 :

Code :
  1. toto=A
  2. echo xxx  | while read line ; do toto=B ; done
  3. echo $toto


 
ca repond "A" en cygwin et en bsh sous AIX
et B en AIX (ksh ,sh, tsh)


J'aime bien tes tests... surtout les 2 premiers où tu pipes aucun flux. Mais tu as effectivement mis le doigt sur de curieuses trouvailles... surtout que dans les 2 premiers tests, l'affectation "toto=B" se fait avant chaque pipe.
 

gloo a écrit :

Franchement, j'aimerais bien avoir une explication... je ne sais pas ou la chercher .....


Moi je comprends que dalle. Ptet poser la question à Steve Bourne (oui, je l'appelle Steve en privé mais il veut pas que cela se sache  :sol: )


Message édité par Sve@r le 23-06-2006 à 19:35:34

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 23-06-2006 à 19:34:32   

Reply

Marsh Posté le 23-06-2006 à 19:59:58    


ok, de mon coté j'appelle David Korn ...  
 
ce WE j essaierai en pdksh sur cygwin...

Reply

Marsh Posté le 26-06-2006 à 09:26:52    

gloo a écrit :

ok, de mon coté j'appelle David Korn ...  
 
ce WE j essaierai en pdksh sur cygwin...


 
 
vachement interessant ces problèmes de "portabilité" de script.... j'appel balmer en sms/private, je suis  sur de le faire triper  :sol:  
 
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed