Bash, c’est puissant, mais parfois, ça fait chier pour pas grand chose
Un autre titre aurait été « Comment des guillemets (ou leur absence) peuvent vous pourrir la vie« , ça aurait été pareil. En ce dimanche 2à Septembre où je commence à écrire ce billet, lendemain d’une soirée particulièrement riche en évènements, je découvre dans mon fil Twitter un appel à l’aide datant de deux jours, sur un problème en Bash. Quoi de mieux pour dé-saouler que de s’y mettre ?
Décrivons le symptôme
Lorsqu’on fait une recherche avec find, il affiche chaque résultat sur une ligne différente :
1 2 3 4 |
[seboss666@Seboss666LTP ~/dev/homepage]$ find . -type d . ./images ./css |
Jusqu’à ce qu’on essaie de stocker ces résultats dans une variable, dans laquelle ils se retrouvent alors tous collés les uns à la suite des autres :
1 2 |
[seboss666@Seboss666LTP ~/dev/homepage]$ result=$(find . -type d); echo $result . ./images ./css |
Et mine de rien, remettre ça sur plusieurs lignes, c’est pas facile, surtout un dimanche matin.
Tentatives râtées
sed, awk, rien n’y fait, soit je vide la ligne, ce qui est très con, soit ça change rien. Et surtout, si par malheur il y a des espaces dans les noms de dossiers (hein les Windowsiens…), ben on risque de casser encore plus le truc. Sans parler du fait qu’avec sed vous risquez de modifier le contenu du fichier plutôt que mettre en forme son nom. Pas top.
Une solution tellement simple qu’on y pensera jamais
C’est en essayant les différentes méthodes pour stocker le contenu des variables que la solution s’est présentée à moi. Reprenons la méthode habituelle pour le stockage de résultat :
1 |
result=$(find . -type d) |
Première étape, on rajoute simplement des guillemets autour :
1 |
result="$(find . -type d)" |
Et donc pour l’affichage, on rajoute là aussi des guillemets :
1 2 3 4 |
[seboss666@Seboss666LTP ~/dev/homepage]$ result="$(find . -type d)"; echo "$result" . ./images ./css |
Presque vingt minutes quand même pour loger ça. Moralité, pas nécessairement besoin de chercher à faire compliqué, la solution peut parfois être très simple. Et en plus ça m’a évité une balade dans une brocante alors que la dernière chose que j’avais envie de faire était de faire fonctionner mes jambes 😀
Ou avec un truc bien crade aussi :
result=$(find . -type d); echo $result | tr » » « n »
😀
Bizzare exactement ce que j’allais dire … Tu m’a vraiment appris des trucs pas propres xD
Je suis encore loin d’avoir fait le tour de toutes les possibilités des brique de ce Lego de geek 😀 (tiens, Djerfy a pas encore changé son avatar ici :P)
Comme quoi les trucs de base c’est parfois trop simple pour etre pensé. Et desolé de t’avoir « imposé » ca un dimanche matin >_<
Y’a pas eu d’imposition t’inquiète 😛