• [^] # Re: Reprend les bases

    Posté par . En réponse au message shell : pipe et variable locale. Évalué à 7.

    meuh si on peut... Il suffit de positionner l'IFS à newline (voire à null dans les cas extreme, mais encore faut-il que ton programme en entrée soit prévu pour).


    BACKUPIFS=$IFS
    IFS=$'\n'

    for trucmuche in $($script); do
    ...
    done
    IFS=$BACKUPIFS


    (note : si tu n'a pas modifié l'IFS avant, unset IFS est plus simple que la sauvegarde / restauration).

    Bon cela dit, c'est pas toujours une bonne solution, parce que si tu as plus de résultats que ton shell ne prend d'arguments, ça foire... Le while read est donc une solution bien plus élégante.

    Dans ce cas là, tu peux utiliser un pipe nommé : ça complexifie un peu, parce qu'il faut le créer (et donc le supprimer, comme un fichier temporaire). L'avantage, c'est que c'est juste un fichier device en mode caractère et donc qu'il n'y a pas d'écriture sur disque.


    #/bin/dash

    script="/bin/ls"

    TMPDIR=$(mktemp -dt script.XXXXXX)
    FIFO=$TMPDIR/script.pipe

    trap "rm -rf $TMPDIR" EXIT

    mkfifo $FIFO


    $script > $FIFO &

    COUNT=0
    while read trucmuche; do
    COUNT=$(($COUNT +1))
    done < $FIFO

    echo $COUNT