क्योंकि मैं इसके लिए गिरता हूं, मैं एक नोट छोड़ना चाहूंगा। मुझे यह धागा मिला, क्योंकि मुझे POSIX संगत होने के लिए एक पुरानी श स्क्रिप्ट को फिर से लिखना होगा। यह मूल रूप से इस तरह से पुनर्लेखन कोड द्वारा 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
लेकिन उत्तरार्द्ध खाली इनपुट पर समान व्यवहार नहीं करता है। पुराने नोटेशन के साथ, जबकि लूप खाली इनपुट पर दर्ज नहीं किया गया है, लेकिन पोसिक्स नोटेशन में है! मुझे लगता है कि यह EOF से पहले की नई लाइन के कारण है, जिसे ommitted नहीं किया जा सकता है। 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