تشغيل أوامر باش مختلفة بناءً على إصدار Java
سؤال
أحاول تطوير نص Bash Build لمشروع Java الذي سيتم تشغيله على Ubuntu و Fedora. يستخدم Ubuntu برنامج التحويل البرمجي GCJ بينما يستخدم Fedora ICEDTEA.
أبلغ كلا من أخطاءهم وتحذيرهما بطرق مختلفة قليلاً ، وأريد أن أتجاهل التحذيرات (أعرف ، ليست فكرة جيدة عمومًا ، لكن بعض التحذيرات ببساطة غبي).
بالنسبة إلى GCJ ، أريد الركض:
javac *.java 2>&1 | grep -A 4 "error:"
لكن بالنسبة إلى ICEDTEA ، أريد الركض:
javac *.java 2>&1 | grep -A 4 "error:\|errors\|.java:"
ما زلت جديدًا على Bash ، فكيف أكتب عبارة if من شأنها أن تدير أحدها مقابل الآخر بناءً على إصدار Javac؟
المحلول
على افتراض تطابق ثنائيات Java و Javac ، وأن Icedtea هي الحالة الخاصة.
#!/bin/bash
ERROR="error:"
java -version 2>&1 | grep -i icedtea > /dev/null
if [ $? -eq 0 ]; then
ERROR="error:\|errors\|.java:"
fi
javac *.java 2>&1 | grep -A 4 $ERROR
على نظامي ، يكون لدى Icedtea و Sun نفس الإخراج لـ "Javac -Version" ، ولكن ليس لـ "Java -Version".
نصائح أخرى
كتابة البرامج النصية لبناء Java في Bash (أو أي لغة شل أخرى) لديها عدد من المشاكل:
تميل البرامج النصية إلى أن تكون غير قابلة للحمل بسبب اختلافات الصدفة ومواقع الأوامر المختلفة وخيارات الأوامر غير المتوافقة وما إلى ذلك ... حتى لو حاولت جعل المحمول.
لا يمكن أن تتعامل البرامج النصية مع التبعيات (أو على الأقل ليس بسهولة)
لا يمكن أن تتعامل البرامج النصية مع إعادة تجميع الأشياء التي تغيرت فقط
بدلاً من ذلك ، أقترح عليك كتابة ملف "build.xml" واستخدم ملف أداة بناء النمل. تتمتع ANT بميزة التشغيل على أي منصة بناء تدير Java ، ورعاية الغالبية العظمى من فروق المنصة. إنه نوع من "صنع" أفضل مصمم خصيصًا لبناء جافا.
#!/bin/sh
JAVAC_VERSION="`java -version 2>&1 /dev/null | awk '/IcedTea/ {print $4}' | sed -e 's/[\(0-9]//g'`"
ICEDTEA="IcedTea"
if [ ${JAVAC_VERSION} = ${ICEDTEA} ]; then
javac *.java 2>&1 | grep -A 4 "error:\|errors\|.java:"
else
javac *.java 2>&1 | grep -A 4 "error:"
fi
exit 0
يجب أن تفعل ذلك - إذا فهمت سؤالك بشكل صحيح. كيف تحصل على الإصدار - لست متأكدًا تمامًا ، ولكن إذا javac -version
غير صحيح فقط قم بتغييره وفقًا لاحتياجاتك.