Ponieważ mi się to podoba, chciałbym upuścić notatkę. Znalazłem ten wątek, ponieważ muszę przepisać stary skrypt sh, aby był zgodny z POSIX. Zasadniczo oznacza to obejście problemu potoku / podpowłoki wprowadzonego przez POSIX poprzez przepisanie kodu w następujący sposób:
some_command | read a b c
w:
read a b c << EOF
$(some_command)
EOF
I kod w ten sposób:
some_command |
while read a b c; do
# something
done
w:
while read a b c; do
# something
done << EOF
$(some_command)
EOF
Ale to ostatnie nie zachowuje się tak samo przy pustym wejściu. W starej notacji pętla while nie jest wprowadzana przy pustym wejściu, ale w notacji POSIX jest! Myślę, że wynika to z nowej linii przed EOF, której nie można pominąć. Kod POSIX, który zachowuje się bardziej jak stara notacja, wygląda następująco:
while read a b c; do
case $a in ("") break; esac
# something
done << EOF
$(some_command)
EOF
W większości przypadków powinno to być wystarczająco dobre. Ale niestety to nadal nie działa dokładnie tak, jak stara notacja, jeśli some_command wypisuje pustą linię. W starej notacji ciało while jest wykonywane, aw notacji POSIX łamiemy się przed ciałem.
Podejście do rozwiązania tego problemu może wyglądać następująco:
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