Karena aku jatuh cinta padanya, aku ingin menjatuhkan catatan. Saya menemukan utas ini, karena saya harus menulis ulang skrip sh lama agar kompatibel dengan POSIX. Ini pada dasarnya berarti untuk menghindari masalah pipa / subkulit yang diperkenalkan oleh POSIX dengan menulis ulang kode seperti ini:
some_command | read a b c
ke:
read a b c << EOF
$(some_command)
EOF
Dan kode seperti ini:
some_command |
while read a b c; do
# something
done
ke:
while read a b c; do
# something
done << EOF
$(some_command)
EOF
Tetapi yang terakhir tidak berlaku sama pada input kosong. Dengan notasi lama loop sementara tidak dimasukkan pada input kosong, tetapi dalam notasi POSIX itu! Saya pikir itu karena baris baru sebelum EOF, yang tidak dapat dibatalkan. Kode POSIX yang berperilaku lebih seperti notasi lama terlihat seperti ini:
while read a b c; do
case $a in ("") break; esac
# something
done << EOF
$(some_command)
EOF
Dalam kebanyakan kasus ini harus cukup baik. Namun sayangnya ini masih berperilaku tidak persis seperti notasi lama jika some_command mencetak baris kosong. Dalam notasi lama tubuh sementara dieksekusi dan dalam notasi POSIX kita istirahat di depan tubuh.
Pendekatan untuk memperbaiki ini mungkin terlihat seperti ini:
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