2010-06-30 27 views
36

मैं सोच रहा हूँ कि कैसे मैं एक Makefile में कुछ गूंज से बचने कर सकते हैं:दबाने संदेशों

clean: 
    rm -fr *.o 

इस नियम प्रिंट होगा:

$>make clean 
rm -fr *.o 

$> 

मैं कैसे बच सकते हैं उस?

उत्तर

21

तथ्य मैं कुछ और की तलाश में गया था, Makefile को यह पंक्ति जोड़कर:

.SILENT:clean 

चुपचाप "साफ" लक्ष्य के हर चरण को निष्पादित करते समय निष्पादित करें।

जब तक कोई इस पर कुछ दोष नहीं देता है, तो मैं इसे अपने पसंदीदा समाधान के रूप में उपयोग करता हूं!

+10

दोष यह है कि आपको अपने मेकअप से कभी भी कोई प्रतिक्रिया नहीं मिलती है, और इसे बंद करने के लिए "चुप" के विपरीत कोई कमांड लाइन नहीं है। यह एक जार खोलने के लिए एक स्लेजहैमर का उपयोग करने जैसा है। –

7

यदि आप कमांड के सामने @ डालते हैं, तो यह खोल पर गूंज नहीं करता है। आरएम को @ आरएम में बदलने का प्रयास करें। (Reference)

63

के साथ शुरू करने के लिए: वास्तविक आदेश अगली पंक्ति पर होना चाहिए (या कम से कम कि जीएनयू के साथ मामला है, है यह अन्य मेक के साथ अलग हो सकता है - मैं इस बात का यकीन नहीं है)

:

clean: 
    rm -rf *.o 

यह मूक एक @ लगाकर द्वारा किया जा सकता बनाना (ध्यान दें, यदि आप एक टैबrm -rf *.o से पहले हर नियम के रूप में की जरूरत है)

तो अपने makefile

clean: 
    @rm -rf *.o 

हो जाता है हटाने के लिए कोई *.o फ़ाइलें हैं, तो आप अभी भी एक त्रुटि संदेश के साथ खत्म हो सकता है। इन को दबाने के लिए,/dev/बातिल के लिए किसी भी त्रुटि संदेश निम्न

clean: 
    [email protected] -rf *.o 2>/dev/null || true 
  • 2>/dev/null पाइप जोड़ने - तो आप किसी भी त्रुटि
  • आदेश के सामने - सुनिश्चित करें कि make ध्यान न दी बनाता है नहीं देखेंगे एक गैर शून्य वापसी कोड
+1

यह इच्छाशक्ति से निपटने का क्लासिक तरीका है, लेकिन मैं जीएनयू की तलाश में था इस समस्या को हल करने का तरीका। और निश्चित रूप से मेरे पास अगली पंक्ति पर आदेश था, बस जल्दी में सवाल लिखा था। बीटीडब्लू, आप क्या सोचते हैं .इस जवाब (जो मेरा एक दोस्त मिला)? – claf

+0

मैंने वास्तव में उपयोग नहीं किया है। सीलेंट, जीएनयू मैनुअल कहता है कि यह केवल ऐतिहासिक कारणों के लिए समर्थित है, लेकिन मुझे यह पसंद है। यह आपके आदेशों में कई '@' से कम वर्बोज़ है। – plof

+1

इसके बारे में सोचने के लिए आओ, '-' और' || सच 'एक साथ बहुत अधिक हैं - या तो उनमें से एक पर्याप्त होना चाहिए। जीएनयू को हटाने के लिए कुछ भी नहीं है, तो आपको छोड़ने से रोकने के लिए उनमें से एक की आवश्यकता है। बेहतर 'आरएम-एफ * .o' का उपयोग करना होगा, क्योंकि अगर हटाने के लिए कुछ भी नहीं है तो इससे कोई त्रुटि नहीं आती है। – plof

3

मैनुअल से: .SILENT is essentially obsolete since @ is more flexible.

बहुत बदतर है कि प्रिंट अभी तक बहुत ज्यादा जानकारी बनाते हैं। आउटपुट में चेतावनी/त्रुटि/निजी संदेश दफन किए जाते हैं। दूसरी तरफ -s (.SILENT) बस कुछ भी दबाता है। विशेष रूप से "कुछ भी करने के लिए नहीं" और "अद्यतित" संदेश दर्द हो सकते हैं। उन्हें दबाने के लिए कोई विकल्प नहीं है। आपको उन्हें सक्रिय रूप से फ़िल्टर करना होगा या colormake जैसे कुछ का उपयोग करना होगा। यहाँ ग्रेप के लिए एक समाधान है:

make | egrep -hiv 'nothing to be done|up to date' 

लेकिन उत्पादन लाइन नंबर होगा।

make | perl -ne '$|=1; print unless /nothing to be done|up to date/i' 

मेक एक त्रुटिपूर्ण उपकरण है: क्योंकि यह लाइन नंबर को घटाती है तथा flushes तुरंत stdout पर्ल समाधान है, इसलिए बेहतर है। "What’s Wrong With GNU make?" इससे बेहतर है कि मैं कर सकता हूं।

10

मैं इस प्राचीन विषय का जवाब दे रहा हूं क्योंकि यह खोज में उच्च आता है और उत्तर उलझन में हैं। बस उपयोगकर्ता क्या चाहता है करने के लिए, की आवश्यकता होती है:

clean: 
    @rm -f *.o 

@ अर्थ यह है कि बनाने कि आदेश गूंज नहीं होंगे। -frm पर तर्क rm बताता है कि किसी भी त्रुटि को अनदेखा करने के लिए, जैसे *.o फ़ाइलें नहीं हैं, और हमेशा सफलता वापस लौटती हैं।

मैंने ओपीएस उदाहरण से -r हटा दिया, क्योंकि इसका मतलब रिकर्सिव है और यहां हम केवल rm आईएनजी .o फाइलें हैं, रिकर्स करने के लिए कुछ नहीं।

2>&1 >/dev/null की कोई आवश्यकता नहीं है क्योंकि -f के साथ कोई त्रुटि मुद्रित नहीं होगी।

.SILENT: clean 

@ के स्थान पर काम करता है, लेकिन यह इतना किसी को बनाए रखने परियोजना बाद में भ्रमित हो सकता है, यह प्रभावित करता है आदेश के रूप में Makefile में एक ही स्थान पर नहीं है। यही कारण है कि @ पसंदीदा है। यह संदर्भ का बेहतर इलाका है।

संबंधित मुद्दे