makefile मेकफाइल में Grep से बाहर निकलें कोड



exit-code (1)

मैं मेकफाइल में एक grep खोज के परिणाम की जांच करना चाहता हूं इस समाधान के विपरीत, मैं शेल कमांड का उपयोग नहीं करना चाहता। इसके अलावा, मैं नहीं चाहता कि मेकफाइल एक त्रुटि को उठाना चाहती है जब grep स्ट्रिंग नहीं मिलती (1 का निकास कोड त्रुटि के रूप में माना जाता है)

निम्न त्रुटि की अनदेखी करने और बाहर निकलने का कोड जांचने का प्रयास करता है:

all:
    -grep term log* 
    echo $$?
    @case "$$?" in \
      0)\
    echo "found";; \
    *) \
    echo "not found";;\
    esac;

दुर्भाग्य से, निकास कोड हमेशा 0 होता है


एक makefile में एक श्रृंखला की एक श्रृंखला की अलग-अलग लाइनें आम तौर पर अलग-अलग उप-गोले में क्रियान्वित की जाती हैं। इसके बाद कोड के लिए, फिर:

all:
    if grep term log*; \
    then echo found; \
    else echo not found; \
    fi

वह एक कमांड है; यह सीधे grep के बाहर निकलने की स्थिति की जांच करता है अर्ध-बृहदान्त्र के उदार उपयोग को ध्यान दें; यह जरूरी है क्योंकि शेल को पारित करने के बाद यह सब सपाट हो जाता है। ध्यान दें कि - जरूरी नहीं है; स्टेटमेंट 0 के साथ संपूर्ण निकास के रूप में बयान, क्योंकि echo कमांड में से एक निष्पादित होता है, सफल होता है, और यह उप-शेल से लौटाई गई स्थिति है लेकिन चाल का एक और हिस्सा है; IIRC, स्क्रिप्ट को /bin/sh -e साथ लागू किया जाता है ताकि स्क्रिप्ट पहली त्रुटि (गैर-शून्य) स्थिति से शेल कमांड पर निकलती है - बिना स्पष्ट शर्तों में, जैसे कि if

यदि आप स्पष्ट रूप से grep की स्थिति पर कब्जा करना चाहते हैं (यदि केवल यह सुनिश्चित करने के लिए कि यह ठीक किया जा रहा है), तो:

all:
    -grep term log*; \
    status=$$?; echo $$status; \
    if [ $$status = 0 ]; \
    then echo found; \
    else echo not found; \
    fi

आपको संभवत - इस समय की आवश्यकता है - इस समय क्योंकि grep को शेल के भाग के रूप में निष्पादित नहीं किया गया है और गैर-शून्य निकास स्थिति -e प्रोसेसिंग को ट्रिगर कर सकती है। मैं इस के साथ futzing की सिफारिश नहीं है

आप ध्यान दें कि आप एक कार्य में cd आज्ञाएं कर सकते हैं और क्योंकि प्रत्येक कार्रवाई अलग से निष्पादित की जाती है, आपको इसे बार-बार करना होगा

install:  ${PROG}
    cd ${INSTBIN}; ${RM_F} ${PROG}
    ${CP} ${PROG} ${INSTBIN}
    cd ${INSTBIN}; ${CHOWN} ${OWNER}:${GROUP} ${PROG}; ${CHMOD} ${PERMS} ${PROG}

हाँ, आप इसे अलग तरह से कर सकते हैं - मैं एक बिंदु का प्रदर्शन कर रहा हूं, प्रोग्रामों को स्थापित करने की शैली की वकालत नहीं करता।





exit-code