الحصول على هدوء جعل خطوط الأوامر صدى على خطأ

StackOverflow https://stackoverflow.com/questions/218208

  •  03-07-2019
  •  | 
  •  

سؤال

لديّ 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. تحقق من ذلك ، قد تجد هذا مفيدًا جدًا إذا كنت تريد معرفة الخطأ الذي حدث في مكان.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top