matafan a écrit :
Si, il y a déjà un problème sur la ligne 1 : il faut qu'il mette des double quotes autour du `ls`, sinon i prendra successivement le nom de chacun des composants de chaque nom de fichier contenant des espaces.
Ensuite suivant ce qu'il fait dans la boucle il faudra éventuellement également qu'il mettre des double quotes autour de $i.
for i in "`ls`"
do
abc "$i" def
done |
|
Le fait de mettre des guillemets autour du ls ne changera rien. Ou dans le meilleur des cas il prendra l'ensemble de tous les noms comme un seul argument. Mais mettre des guillemets à "$i" est une excellente idée.
Puisque le problème vient du for (qui utilise l'espace pour séparer ses éléments), ben faut s'en affranchir. Le read est tout indiqué pour ça puisque lui se cale sur le <return> et que toute ligne (même venant d'une commande) se termine par un <return>...
Code :
#!/bin/bash ls |while read i do abc "$i" def done
|
Petit inconvénient => qui dit pipe dit sous processus. Et donc on ne pourra faire ressortir aucune variable de la boucle. Si ce point ne présente pas de soucis alors c'est bon. Sinon on peut gruger un petit peu en utilisant des parenthèses
Code :
#!/bin/bash ls |( while read i do abc "$i" def var=machin done echo $var )
|
Mais cela ne fait que reporter le problème. Si vraiment on veut s'en affranchir totalement, on ne peut plus utiliser le pipe donc faut passer par un fichier temporaire
Code :
#!/bin/bash # Création du fichier temporaire ls >fichier_temporaire # Création du buffer input contenant le fichier exec 3<fichier_temporaire # Le fichier ne sert plus à rien car il est dans le buffer rm -f fichier_temporaire # Lecture du buffer while read i 0<&3 do abc "$i" def var=machin done echo $var
|
Cette solution évite les problèmes mentionnés précédement mais on entre dans une autre problématique concernant les accès multiples sur le même fichier (si le script est lancé deux fois en parallèle => dommage pour "fichier_temporaire" ) qui ne peut se régler que par la création d'un fichier temporaire au nom unique (en incluant par exemple dans son nom la variable "$$" => n° process)
Comme quoi, en partant d'un problème tout con, si on veut tout gérer on peut arriver à des sacrés soucis...
---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.