Sortir les variables d'un while

Le lundi 24 juin 2013 par Benjamin Boudoir

Petit 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.