2010-09-14 12 views
33

मैं अगले स्ट्रिंग प्रदर्शित करने के लिए फ़ाइल बनाने के लिए मजबूर करने की कोशिश कर रहा हूँ:

"Please execute next commands: 
setenv PATH /usr/local/greenhills/mips5/linux86:$PATH" 

समस्या "$PATH" के साथ है। कमान

@echo "setenv PATH /usr/local/greenhills/mips5/linux86:$PATH" 

एक परिणाम के कारण

"setenv PATH /usr/local/greenhills/mips5/linux86:ATH" 

भागने वर्ण, उद्धरण के किसी भी संयोजन, "$(shell echo " परिणाम की आवश्यकता नहीं जा सके थे ...

कोई सुझाव?

उत्तर

37

manual for GNU make में, वे इस विशिष्ट उदाहरण के बारे में बात जब value समारोह का वर्णन:

मूल्य समारोह आप इसे विस्तार के बिना एक चर के मूल्य का उपयोग करने के लिए एक तरह से प्रदान करता है। कृपया ध्यान दें कि यह पूर्ववत विस्तार नहीं है जो पहले से ही हुआ है; उदाहरण के लिए यदि आप एक बस विस्तारित चर बनाते हैं तो इसका मान परिभाषा के दौरान विस्तारित होता है; उस स्थिति में वैल्यू फ़ंक्शन वैरिएबल का उपयोग करने के समान ही परिणाम लौटाएगा।

मूल्य समारोह की वाक्य रचना है:

$(value variable) 

ध्यान दें कि चर एक चर का नाम है; उस चर के संदर्भ नहीं है। इसलिए आप इसे लिखते समय '$' या कोष्ठक का उपयोग नहीं करेंगे। (हालांकि, आप नाम पर एक चर संदर्भ का उपयोग कर सकते है अगर आप नाम एक स्थिर नहीं होना चाहता हूँ।)

इस समारोह का परिणाम चर के मूल्य युक्त एक स्ट्रिंग है, होने वाली किसी भी विस्तार के बिना । उदाहरण के लिए, इस makefile में:

FOO = $PATH 

all: 
     @echo $(FOO) 
     @echo $(value FOO) 

पहले उत्पादन लाइन एथलीट, होगा क्योंकि "$ पी" एक मेकअप चर के रूप में विस्तार किया जाएगा, जबकि दूसरा उत्पादन लाइन के वर्तमान मूल्य होगा अपने $ पाथ पर्यावरण चर, क्योंकि मान फ़ंक्शन विस्तार से बचा है।

+0

यह इंगित करने के लिए धन्यवाद कि परिवर्तनीय घोषणा लक्ष्य के बाहर की जाती है। क्या उन्हें एक लक्ष्य के भीतर परिभाषित किया जा सकता है? – Crt

12

make$ का उपयोग अपने variable expansions के लिए करता है। जैसे एकल वर्ण परिवर्तनीय $A या एक लंबे नाम के साथ चर - ${VAR} और $(VAR)

एक आदेश में $ में कहें, $$ उपयोग करते हैं, उदाहरण के लिए:

all: 
    @echo "Please execute next commands:" 
    @echo 'setenv PATH /usr/local/greenhills/mips5/linux86:$$PATH' 

भी ध्यान रखें कि make को "" और '' (डबल और के हवाले से एक) किसी भी भूमिका नहीं है और वे पारित कर रहे हैं खोल के लिए verbatim। (@ को make खोलने के लिए साइन इन करने के लिए साइन इन करें।) $PATH का विस्तार करने से खोल को रोकने के लिए, दूसरी पंक्ति '' का उपयोग करती है।

+0

धन्यवाद, आपने मुझे दिशा दी है! @echo "setenv PATH/usr/local/greenhills/mips5/linux86: $$ PATH" पूरे $ PATH मुद्रित होने के मामले में, लेकिन @echo 'setenv PATH/usr/local/greenhills/mips5/linux86: $$ PATH ' काम करें! – BaruchLi

+0

क्योंकि, जैसा कि मैंने नोट किया है कि '' '' '' '' '' को खोल में पास किया गया है। '' '' खोल के अंदर '$ पाथ 'का विस्तार होगा, लेकिन' '' के अंदर नहीं। – Dummy00001

+0

अनुस्मारक के लिए धन्यवाद यह बहुत लंबा रहा है क्योंकि मैंने –

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