Parce que je tombe amoureux d'elle, je voudrais laisser une note. J'ai trouvé ce fil, car je dois réécrire un ancien script sh pour qu'il soit compatible POSIX. Cela signifie essentiellement pour contourner le problème de pipe / sous-shell introduit par POSIX en réécrivant le code comme ceci:
some_command | read a b c
dans:
read a b c << EOF
$(some_command)
EOF
Et un code comme celui-ci:
some_command |
while read a b c; do
# something
done
dans:
while read a b c; do
# something
done << EOF
$(some_command)
EOF
Mais ce dernier ne se comporte pas de la même manière sur une entrée vide. Avec l'ancienne notation, la boucle while n'est pas entrée sur une entrée vide, mais en notation POSIX c'est le cas! Je pense que c'est dû à la nouvelle ligne avant l'EOF, qui ne peut pas être supprimée. Le code POSIX qui se comporte plus comme l'ancienne notation ressemble à ceci:
while read a b c; do
case $a in ("") break; esac
# something
done << EOF
$(some_command)
EOF
Dans la plupart des cas, cela devrait être suffisant. Mais malheureusement, cela ne se comporte toujours pas exactement comme l'ancienne notation si some_command imprime une ligne vide. Dans l'ancienne notation, le corps while est exécuté et dans la notation POSIX, nous nous cassons devant le corps.
Une approche pour résoudre ce problème pourrait ressembler à ceci:
while read a b c; do
case $a in ("something_guaranteed_not_to_be_printed_by_some_command") break; esac
# something
done << EOF
$(some_command)
echo "something_guaranteed_not_to_be_printed_by_some_command"
EOF