Como me enamoro, me gustaría dejar una nota. Encontré este hilo, porque tengo que reescribir un antiguo script sh para que sea compatible con POSIX. Esto básicamente significa evitar el problema de tubería / subshell introducido por POSIX reescribiendo código como este:
some_command | read a b c
dentro:
read a b c << EOF
$(some_command)
EOF
Y código como este:
some_command |
while read a b c; do
# something
done
dentro:
while read a b c; do
# something
done << EOF
$(some_command)
EOF
Pero este último no se comporta igual en la entrada vacía. Con la antigua notación, el bucle while no se ingresa en una entrada vacía, ¡pero en la notación POSIX sí! Creo que se debe a la nueva línea antes de EOF, que no se puede omitir. El código POSIX que se comporta más como la antigua notación se ve así:
while read a b c; do
case $a in ("") break; esac
# something
done << EOF
$(some_command)
EOF
En la mayoría de los casos, esto debería ser lo suficientemente bueno. Pero desafortunadamente, esto todavía no se comporta exactamente como la antigua notación si some_command imprime una línea vacía. En la antigua notación, el cuerpo while se ejecuta y en la notación POSIX nos separamos frente al cuerpo.
Un enfoque para solucionar esto podría verse así:
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