2009-06-21 9 views
5

मैं यह जांचने के लिए कैसे जाउंगा कि जीसीसी एक प्रोग्राम संकलित करने में विफल रहा है, असफल रहा है, या सफल रहा है लेकिन चेतावनी के साथ?यह जांचने के लिए कि क्या gcc विफल हुआ है, चेतावनी लौटा दी है, या सफल हुआ? (बाश में)

#!/bin/sh 

string=$(gcc helloworld.c -o helloworld) 

if [ string -n ]; then 
    echo "Failure" 
else 
    echo "Success!" 
fi 

यह केवल जांच करता है कि यह सफल रहा है या (विफल रहा है या चेतावनी के साथ संकलित)।

-n का मतलब है "शून्य नहीं है"।

धन्यवाद!

EDIT यदि यह स्पष्ट नहीं है, तो यह काम नहीं कर रहा है।

+0

एक और कारण है कि यह संभवतः काम नहीं कर सकते हैं: सही सिंटैक्स है '[-n" $ स्ट्रिंग "]'। – ephemient

+3

ध्यान दें कि चेतावनियां प्रस्तुत होने पर भी जीसीसी 0 का एक्जिट कोड लौटाएगी। – dtmland

उत्तर

15
if gcc helloworld.c -o helloworld; then 
echo "Success!"; 
else 
echo "Failure"; 
fi 

आप वापसी कोड का परीक्षण करने के लिए बैश चाहते हैं, आउटपुट नहीं। आपका कोड stdout को कैप्चर करता है, लेकिन जीसीसी द्वारा आवंटित मान को अनदेखा करता है (यानी मुख्य() द्वारा लौटाया गया मान)।

+2

वैकल्पिक रूप से, एक अलग खोल स्क्रिप्ट लाइन में जीसीसी चलाएं, फिर $ परीक्षण करें? –

19

आपकी हालत होना चाहिए:

if [ $? -ne 0 ] 

जीसीसी सफलता या विफलता पर कुछ और पर शून्य वापस आ जाएगी। वह पंक्ति कहती है "अगर अंतिम आदेश शून्य से कुछ और लौटाता है।"

11

त्रुटियों के साथ पूरी तरह से साफ और संकलन के बीच अंतर बताने के लिए, पहले सामान्य रूप से संकलित करें और $ परीक्षण करें? यदि गैर-शून्य, संकलन विफल रहा। इसके बाद, वाइब्रर (चेतावनियों को त्रुटियों के रूप में माना जाता है) के साथ संकलित करें। $ टेस्ट? - अगर 0, यह चेतावनी के बिना संकलित। यदि शून्य नहीं है, तो यह चेतावनियों के साथ संकलित है।

पूर्व:

gcc -Wall -o foo foo.c 
if [ $? -ne 0 ] 
then 
    echo "Compile failed!" 
    exit 1 
fi 

gcc -Wall -Werror -o foo foo.c 
if [ $? -ne 0 ] 
then 
    echo "Compile succeeded, but with warnings" 
    exit 2 
else 
    echo "Compile succeeded without warnings" 
fi 
+0

इस ब्रूट फोर्सिंग में दो संकलन शामिल हैं। यदि आप वास्तव में उस तरह से जाना चाहते हैं तो दूसरे रन में '-फिनटैक्स-केवल' शामिल होना चाहिए (पूर्ण कोड को पार्स करने से कहीं अधिक कुछ नहीं होगा)। किसी भी मामले में 'gcc के आउटपुट को अतिरिक्त चेक करने का विकल्प (एक अस्थायी फ़ाइल में अपने stdout को संग्रहीत करना और' arning' के लिए grep [w w अपरकेस में हो सकता है या नहीं]) बेहतर समाधान हो सकता है। –

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