Bash EOF لديه سلوك غير متوقع
سؤال
كنت أستخدم نصًا سريعًا وقذرًا لأتمتة عملية تقسيم CF.
هذا عمل بشكل جيد حتى أردت أن أضيف إليه.
في الأساس ، لديّ برنامج نصي يقوم بتقسيم فلاش مضغوط على هذا النحو:
CMD=.fdisk
DEV=/dev/sdc
echo "Calculating partition sizes..."
P1SIZE=+1100M
P2SIZE=+1200M
echo "Creating instruction file..."
PT1="n p 1\n $P1SIZE"
PT2="n p 2\n $P2SIZE"
END="a 1 w EOF\n"
[ -e $CMD ] && rm -rf $CMD
for i in $PT1 $PT2 $END; do echo -e $i >> $CMD; done
echo "Creating partitions..."
fdisk $DEV << EOF < $CMD
[ -e $CMD ] && rm -f $CMD
والفكرة هي أنه في المستقبل سيتم إنشاء الملف الذي يمثله "$ CMD" تلقائيًا بواسطة أداة خارجية مع قيم البدء والنهاية المناسبة. الآن أنا ببساطة أقبل البداية الافتراضية وأقدم الحجم.
لقد نجح هذا جيدًا حتى أردت دمج بعض الخطوات الإضافية في البرنامج النصي. لكنني واجهت مشاكل عندما لاحظت سلوكيات غريبة.
الأول هو أنه إذا قمت بإضافة الكود أعلاه داخل وظيفة ، فسوف أستمر في الحصول على خطأ نصوص:
line XX: syntax error: unexpected end of file
أيضًا ، أدركت أن أي رمز إضافي بعد أمر "fdisk" لن يتم تنفيذه ويبدو أن البرنامج النصي ينتهي ببساطة (بدون أخطاء ، $؟ = 0).
هل يعرف أي شخص لماذا لا تعمل الوظيفة وينتهي البرنامج النصي؟
المحلول
لقد بدأت Heredoc (<< EOF
) ، لكنك لا تنهيها في أي مكان.
نصائح أخرى
هناك قاعدة من الإبهام هي أن "سلسلة الحد" التي تستخدمها (كنت أستخدم "EOF" في حالتي ، ولكن يمكنك استخدام أي شيء تريده) يجب ألا يكون لديه مسافات (أو علامات تبويب) أمامها. إذا كان الأمر كذلك ، فلن يعتبر النهاية.
مثال:
myFunction() {
cat << EOF
Hello
World
EOF
}
يعتبر "EOF" أعلاه نصًا منتظمًا لأنه يحتوي على مسافات أمامه! إذا كتبت ما يلي بدلاً من ذلك:
myFunction() {
cat << EOF
Hello
World
EOF
}
ستعمل الآن!
إذا أصرت على استخدام المساحات ، فيمكنك قمع علامات التبويب باستخدام حرف "-" إلى اليمين المباشر لأحرف "<<".
مثال:
myFunction() {
cat <<- EOF
Hello
World
EOF
}
لاحظ أن هذا يعمل فقط لعلامات التبويب وليس المساحات! هذا رائع للحفاظ على الكود الخاص بك أكثر قابلية للقراءة.
لاحظ أيضًا أنه إذا اقتبدت من "سلسلة الحد" ، ينتهي بك الأمر إلى تعطيل استبدال المعلمة. لذلك إذا كنت ترغب في كتابة نص لا ينبغي استبداله أو تنفيذه ، فإن هذا يجعل الأمر ممكنًا:
cat << "EOF"
Type `ls -la` at the command prompt
EOF