Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1303 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [RESOLU] [Shell] question de laisse

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] [Shell] question de laisse

n°1393010
youx21
Posté le 22-06-2006 à 17:47:04  profilanswer
 

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
mood
Publicité
Posté le 22-06-2006 à 17:47:04  profilanswer
 

n°1393109
Sve@r
Posté le 22-06-2006 à 20:16:35  profilanswer
 

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.
n°1393425
youx21
Posté le 23-06-2006 à 09:53:02  profilanswer
 


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

n°1393623
gloo
Posté le 23-06-2006 à 14:07:02  profilanswer
 

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 ?

n°1393735
youx21
Posté le 23-06-2006 à 15:43:25  profilanswer
 

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) ???

n°1393793
gloo
Posté le 23-06-2006 à 16:36:48  profilanswer
 

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

n°1393805
youx21
Posté le 23-06-2006 à 16:43:45  profilanswer
 

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
n°1393827
Sve@r
Posté le 23-06-2006 à 16:57:31  profilanswer
 

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.
n°1393873
gloo
Posté le 23-06-2006 à 17:28:15  profilanswer
 

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
n°1393938
Sve@r
Posté le 23-06-2006 à 19:34:32  profilanswer
 

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.
mood
Publicité
Posté le 23-06-2006 à 19:34:32  profilanswer
 

n°1393944
gloo
Posté le 23-06-2006 à 19:59:58  profilanswer
 


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

n°1394764
youx21
Posté le 26-06-2006 à 09:26:52  profilanswer
 

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:  
 
 
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [RESOLU] [Shell] question de laisse

 

Sujets relatifs
Reformater le contenu d'un fichier txt en html [RESOLU][C#/Flash/ RESOLU] Soucis de cache IE avec donnees externes a charger
[xsl][Résolu] problème de if[resolu]Remplir une listbox avec bdd access
[RESOLU]erreur de syntaxprocedure trop longue résolu
[Résolu]Récupérer l'id du dernier enregistrement d'une table MySql[résolu]Décalage de vignettes
[RESOLU] Créer un document RTF avec du PHP[Résolu] [DOM Scripting] Afficher/masquer des images
Plus de sujets relatifs à : [RESOLU] [Shell] question de laisse


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR