الحصول على هدوء جعل خطوط الأوامر صدى على خطأ
سؤال
لديّ Makefile Building العديد من ملفات C ذات خطوط قيادة طويلة طويلة وقمنا بتنظيف الإخراج من خلال وجود قواعد مثل:
.c${MT}.doj:
@echo "Compiling $<";\
$(COMPILER) $(COPTS) -c -o $@ $<
الآن هذا رائع لأن @ يقمع خط التجميع الذي ينبعث منه. ولكن عندما نحصل على خطأ ، كل ما نحصل عليه هو رسالة الخطأ ، لا يوجد سطر أوامر. هل يمكن لأي شخص التفكير في طريقة "أنيقة" لإبعاد سطر الأوامر؟ كل ما يمكنني التفكير فيه هو صدده إلى ملف والحصول على مستوى أعلى ، مما يجعل الخطأ واتحث الملف. أنا أعلم.
المحلول
تم اختباره وعمل (GNU Make in Linux):
.c${MT}.doj:
@echo "Compiling $<";\
$(COMPILER) $(COPTS) -c -o $@ $< \
|| echo "Error in command: $(COMPILER) $(COPTS) -c -o $@ $<" \
&& false
نصائح أخرى
هذا السؤال قديم جدًا ، لكن بالنسبة لأولئك منكم googling ، أعتقد أن ما سأفعله في هذا الموقف هو الاسم المستعار make
إلى make -s
(الوضع الصامت) في قشرة بلدي ، ووضع فقط @
بادئة قبل الخطوط حيث echo
أو أوامر تشخيصية أخرى يتم استدعاءها. عندما أريد الإخراج الكامل من make
, ، سوف أتجاوز الاسم المستعار عن طريق تسميته على أنه \make
.
لاحظ أيضًا أنه في هذه الحالة ستحتاج إلى القيام بالشيء المعتاد ووضع @echo
على خطه الخاص ، مع أوامر القاعدة الفعلية على خطوط منفصلة وبدون @
'س.
سيكون الحل البسيط هو استخدام برنامج نصي بسيط abc
مثل ما يلي:
#!/bin/bash
$@
code=$?
if (( code )); then
echo error running $@
fi
exit $code
ثم يمكنك الكتابة abc $(COMPILER) $(COPTS) -c -o $@ $<
في الخاص بك Makefile
. لاحظ أن هذا لا يعمل عندما يكون لديك أنابيب أو إعادة توجيه (حيث سيتم تطبيقها abc
بدلاً من الأمر الذي تريد تشغيله).
يمكنك أيضًا وضع رمز مماثل مباشرة في Makefile
إذا كان هذا هو الأفضل.
لقد استخدمت مؤخرًا فائدة تسمى logtext بالنسبة لأمثال تتبع ما حدث الإخراج أثناء تنفيذ ملف BAT. تحقق من ذلك ، قد تجد هذا مفيدًا جدًا إذا كنت تريد معرفة الخطأ الذي حدث في مكان.