मेरे पास एक Makefile है जिसमें किसी दिए गए वेरिएबल को प्रिंट करने का लक्ष्य है:

print-%:
    @echo $*=$($*)

उदाहरण के लिए वेरिएबल CURDIR के मान को प्रिंट करने के लिए मैं सिर्फ निम्नलिखित कमांड जारी करता हूं:

make print-CURDIR

और यहाँ परिणाम है:

CURDIR=/Users/j3d/Projects/myproject

अब मैं एक शेल स्क्रिप्ट बनाना चाहता हूं जिसमें किसी भी Makefile से सामान्य कार्यों का एक सेट शामिल है ... और यहां ऊपर लक्ष्य का संशोधित संस्करण है:

print-%:
    . ./make-util printvar $@

और ये रहा make-util:

#!/bin/sh

printvar()
{
    @echo $*=$(*)
}

अंत में, ऊपर की स्क्रिप्ट चला रहे हैं ...

j3d@j3ds-macbook-pro myproject % make print-CURDIR

... अपेक्षित परिणाम नहीं देता है:

. ./make-utils CURDIR

मुझे स्क्रिप्ट फ़ंक्शन को कैसे शुरू करना चाहिए ताकि दिया गया चर सही ढंग से मुद्रित हो जाए?

0
j3d 19 फरवरी 2021, 10:56

2 जवाब

सबसे बढ़िया उत्तर

आप मेक रेसिपी का एक सूट बना सकते हैं (यदि आप जीएनयू मेक का उपयोग कर रहे हैं) जिसे आप कई मेकफाइल्स में शामिल और उपयोग कर सकते हैं, लेकिन आपको इसे मेक सिंटैक्स के साथ करना होगा, न कि शेल< /em> वाक्य रचना, क्योंकि वे व्यंजन बनाते हैं, भले ही नुस्खा विस्तार के बाद एक शेल स्क्रिप्ट बन जाए।

आप GNU मेक define स्टेटमेंट की जांच कर सकते हैं और eval और call उपयोगकर्ता-परिभाषित बनाने के तरीकों के लिए कार्य करता है जीएनयू में कार्य करता है। उदाहरण के लिए आप इस तरह एक मेकफ़ाइल लिख सकते हैं:

$ cat macros.mk
print-%:
        @echo $*=$($*)

फिर आपके अन्य मेकफ़ाइल में आप इसका उपयोग कर सकते हैं:

include macros.mk

और आपको वह नियम स्वतः उपलब्ध हो जाएगा।

यहां बहुत सारी संभावनाएं हैं लेकिन विवरण इस बात पर निर्भर करता है कि आप क्या करना चाहते हैं।

2
MadScientist 19 फरवरी 2021, 17:21

आप लगभग वहां हैं:

चूंकि आप फ़ंक्शन के नाम को पहले पैरामीटर के रूप में पास कर रहे हैं, आप कर सकते हैं a

#!/bin/sh
printvar()
{
  @echo $*=$(*)
}
"$1"

समारोह निष्पादित करने के लिए। यदि आप अधिक सुरक्षा चाहते हैं (उन मामलों को पकड़ने के लिए जहां आप गलती से किसी फ़ंक्शन नाम के बजाय कुछ खतरनाक कमांड पास करते हैं), तो आप कर सकते हैं a

[ "$1" = printvar ] && printvar
[ "$1" = other_function ] && other_function

बजाय।

यदि आप अपनी स्क्रिप्ट मेक-वेरिएबल को संसाधित करना चाहते हैं, तो आप उन्हें अतिरिक्त पैरामीटर के रूप में पास कर सकते हैं:

func=$1
shift
[ "$func" = printvar ] && printvar "$@"
[ "$func" = other_function ] && other_function "$@"
1
user1934428 19 फरवरी 2021, 11:18