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.
[^] # Re: Reprend les bases
Posté par nodens . En réponse au message shell : pipe et variable locale. Évalué à 7.
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