2012-11-28 14 views
5

के अंदर एक फ़ाइल पढ़ना मैं मेकफ़ाइल के अंदर मेटाफाइल नामक फ़ाइल को पढ़ना चाहता हूं।मेकफ़ाइल

मेटाफ़ाइल इस तरह दिखता है:
file1
करें 2
file3

मैं लाइन द्वारा मेरी makefile की रेखा के भीतर इस मेटाफ़ाइल पढ़ सकते हैं और जाँच फ़ाइलों के अंदर उल्लेख किया है या नहीं और केवल प्रिंट नामों अगर करने की जरूरत है फाइलों की मौजूद है।

मैंने सफलता के बिना कुछ चीजों की कोशिश की है। जैसे:

FILE=`cat metafile` 
for line in $(FILE); if [ -e $${line} ]; then echo $${line} fi; done; 
+0

क्या आप उन दोनों पंक्तियों को नुस्खा में करने का प्रयास कर रहे हैं? प्रत्येक पंक्ति को एक अलग सबहेल में निष्पादित किया जाता है। आप 'लाइन डालकर अगली पंक्ति के साथ एक लाइन में शामिल हो सकते हैं; \ अंत में। लेकिन फिर पहला चर '$$ {LINE}' '' '(LINE)' होगा। – tripleee

उत्तर

11

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

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 पर निर्भरता को फिल्टर करने की जरूरत है होते हैं (या इसे अघोषित छोड़; मेरा मानना ​​है कि जीएनयू सामना करना चाहिए है)।

+0

इस तरह के विस्तृत प्रतिक्रिया के लिए धन्यवाद। मैं पहली बार कोशिश कर रहा हूं जब आपने उल्लेख किया था लेकिन ओ/पी के रूप में कुछ भी नहीं मिला। दूसरी "$ फ़ाइल" भी "$$ फ़ाइल" होनी चाहिए ?? – hari

+0

कोई चिंता नहीं, यह काम किया। – hari