Weil ich darauf hereinfalle, möchte ich eine Notiz hinterlassen. Ich habe diesen Thread gefunden, weil ich ein altes sh-Skript neu schreiben muss, um POSIX-kompatibel zu sein. Dies bedeutet im Grunde, das von POSIX verursachte Rohr- / Unterschalenproblem zu umgehen, indem Code wie folgt umgeschrieben wird:
some_command | read a b c
in:
read a b c << EOF
$(some_command)
EOF
Und Code wie folgt:
some_command |
while read a b c; do
# something
done
in:
while read a b c; do
# something
done << EOF
$(some_command)
EOF
Letzteres verhält sich jedoch bei leerer Eingabe nicht gleich. Mit der alten Notation wird die while-Schleife nicht bei leerer Eingabe eingegeben, sondern in der POSIX-Notation! Ich denke, es liegt an der Newline vor EOF, die nicht weggelassen werden kann. Der POSIX-Code, der sich eher wie die alte Notation verhält, sieht folgendermaßen aus:
while read a b c; do
case $a in ("") break; esac
# something
done << EOF
$(some_command)
EOF
In den meisten Fällen sollte dies gut genug sein. Leider verhält sich dies immer noch nicht genau wie die alte Notation, wenn some_command eine leere Zeile druckt. In der alten Notation wird der while-Körper ausgeführt und in der POSIX-Notation brechen wir vor dem Körper.
Ein Ansatz, um dies zu beheben, könnte folgendermaßen aussehen:
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