เพราะฉันตกหลุมรักฉันจึงอยากจะส่งโน้ต ฉันพบกระทู้นี้เพราะฉันต้องเขียนสคริปต์ sh เก่าเพื่อให้รองรับ POSIX นี่หมายถึงการหลีกเลี่ยงปัญหาท่อ / subshell ที่แนะนำโดย POSIX โดยการเขียนรหัสใหม่เช่นนี้:
some_command | read a b c
เป็น:
read a b c << EOF
$(some_command)
EOF
และรหัสเช่นนี้:
some_command |
while read a b c; do
# something
done
เป็น:
while read a b c; do
# something
done << EOF
$(some_command)
EOF
แต่หลังไม่ทำงานเหมือนกันในการป้อนข้อมูลที่ว่างเปล่า ด้วยสัญกรณ์เก่าขณะที่ลูปไม่ได้ถูกป้อนในอินพุตว่างเปล่า แต่ในเครื่องหมาย POSIX มันคือ! ฉันคิดว่าเป็นเพราะการขึ้นบรรทัดใหม่ก่อน EOF ซึ่งไม่สามารถแก้ไขได้ รหัส POSIX ซึ่งทำงานเหมือนสัญลักษณ์เก่า ๆ จะมีลักษณะดังนี้:
while read a b c; do
case $a in ("") break; esac
# something
done << EOF
$(some_command)
EOF
ในกรณีส่วนใหญ่ควรจะดีพอ แต่น่าเสียดายที่นี่ยังคงทำงานไม่เหมือนกับสัญกรณ์เก่าถ้า some_command พิมพ์บรรทัดว่างเปล่า ในสัญกรณ์เก่าขณะที่ร่างกายถูกประหารชีวิตและในสัญกรณ์ POSIX เราจะแตกต่อหน้าร่างกาย
วิธีแก้ไขปัญหานี้อาจมีลักษณะเช่นนี้:
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