आप लक्ष्य में शेल स्क्रिप्ट का मनमाना टुकड़ा डाल सकते हैं। मेकफ़ाइल वैरिएबल में फ़ाइल की सामग्री को रखने से मुझे कोई समझ नहीं आती है, जब तक कि आपको अन्य कारणों से अन्य लक्ष्यों में डेटा की आवश्यकता न हो। (यदि हां, तो आप बैकटिक, वैसे भी उपयोग कर सकते हैं नहीं।)
target:
@while read -r file; do \
test -e "$$file" && echo "$$file"; \
done <metafile
क्या इसके लायक है के लिए, while
पाश बैकटिक साथ for
पाश की तुलना में एक खोल स्क्रिप्ट में एक फ़ाइल के लाइनों पर पाश करने के लिए एक सुरक्षित और अधिक मुहावरेदार तरीका है , भले ही आप इसे बहुत देखते हैं।
(@ बनाओ रोकता खोल स्क्रिप्ट गूंज से कमांड, कि बाहर ले अगर किसी कारण से आप उन्हें देखने के लिए की जरूरत है।)
एक Makefile में यह करने के लिए एक और अधिक मुहावरेदार तरह से लक्ष्य निर्भर है इन फ़ाइलों पर, और मेक का अपना तर्क प्रयोग करें:
target: file1 file2 file3
@echo $(filter-out $?,$^)
यह जीएनयू वाक्यविन्यास बनाओ; यदि आप अन्य को पोर्टेबल बनना चाहते हैं तो यह अधिक जटिल हो सकता है (उस बिंदु पर जहां शेल स्क्रिप्ट सभी के बाद बेहतर हो सकती है)। यह सब कुछ एक पंक्ति पर गूंज देगा, लेकिन यदि आपको अलग-अलग लाइनों की आवश्यकता है, तो यह एक छोटा फिक्स होना चाहिए।
मैं बस एक छोटा सा सहायक Makefile टुकड़ा का निर्माण होगा और निर्भरता में शामिल हैं:
target: target.d
target.d: metafile
sed 's/^/target: /' $< >[email protected]
include target.d
यह निर्भरता की एक छोटी सूची है ताकि आप उन्हें target:
निर्भरता को स्पष्ट रूप में सूचीबद्ध करने के लिए की जरूरत नहीं है बनाता है; तो बजाय file1 file2 file3
ऊपर नुस्खा में, निर्भरता उत्पन्न target.d
में रहते हैं जो
target: file1
target: file2
target: file3
आप target.d
पर निर्भरता को फिल्टर करने की जरूरत है होते हैं (या इसे अघोषित छोड़; मेरा मानना है कि जीएनयू सामना करना चाहिए है)।
क्या आप उन दोनों पंक्तियों को नुस्खा में करने का प्रयास कर रहे हैं? प्रत्येक पंक्ति को एक अलग सबहेल में निष्पादित किया जाता है। आप 'लाइन डालकर अगली पंक्ति के साथ एक लाइन में शामिल हो सकते हैं; \ अंत में। लेकिन फिर पहला चर '$$ {LINE}' '' '(LINE)' होगा। – tripleee