Sortir les variables d'un while
Le lundi 24 juin 2013 par Benjamin BoudoirPetit bashism pratique.
Lorsque que l'on fait une commande du style :
macommande | while read line
do
bidule=$(line | chouette)
done
On ne peut pas accéder à la variable $bidule.
Petit trick :
while read line
do
bidule=$(line | chouette)
done < <(macommande)
Et voilà !
L'explication est simple, avec un pipe, while fait un fork. A la fin du fork, ses variables disparaissent.
En passant la commande comme ceci, while reste dans le même processus, et on conserve nos jolies variables.
Et pour la version portable :
tmpfile=`mktemp`
(macommande) > $tmpfile
exec 4< $tmpfile
while IFS=$'\n' read -u 4 line
do
bidule=$(line | chouette)
done
Ici, on créé simplement un nouveau file descriptor théoriquement inutilisé (0 : stdin, 1 : stdout, 2 : stderr) et on fait lire read dessus.