Perché mi innamoro di questo, vorrei lasciare un messaggio. Ho trovato questo thread, perché devo riscrivere un vecchio script sh per essere compatibile con POSIX. Ciò significa sostanzialmente aggirare il problema pipe / subshell introdotto da POSIX riscrivendo il codice in questo modo:
some_command | read a b c
in:
read a b c << EOF
$(some_command)
EOF
E codice come questo:
some_command |
while read a b c; do
# something
done
in:
while read a b c; do
# something
done << EOF
$(some_command)
EOF
Ma quest'ultimo non si comporta allo stesso modo con input vuoti. Con la vecchia notazione il ciclo while non viene inserito su input vuoto, ma nella notazione POSIX lo è! Penso che sia dovuto alla nuova riga prima dell'EOF, che non può essere omessa. Il codice POSIX che si comporta più come la vecchia notazione è simile al seguente:
while read a b c; do
case $a in ("") break; esac
# something
done << EOF
$(some_command)
EOF
Nella maggior parte dei casi questo dovrebbe essere abbastanza buono. Ma sfortunatamente questo non si comporta esattamente come la vecchia notazione se some_command stampa una riga vuota. Nella vecchia notazione viene eseguito il corpo while e nella notazione POSIX ci rompiamo davanti al corpo.
Un approccio per risolvere questo problema potrebbe apparire così:
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