2014-04-27 3 views
15

मैं मेक फ़ाइल में स्ट्रिंग कैसे और कब उद्धृत करूं? सबसे अच्छा अभ्यास क्या है?जीएनयू मेकफ़ाइल स्ट्रिंग्स को कैसे और कब उद्धृत करें

उद्धरण का तरीका निम्नलिखित है?

$(warning $(shell ls -ld "$(CURDIR)")) 

मैं बैश से परिचित हूं जहां आप आमतौर पर एम्बेडेड रिक्त स्थान की अनुमति देने के लिए चर उद्धृत करते हैं। क्या आप मेकफ़ाइल में ऐसा करते हैं?

मुझे स्ट्रिंग के साथ असाइनमेंट स्टेटमेंट कैसे करना चाहिए?

vara := "$(CURDIR)" 

varb := $(CURDIR) 

varc := /home/me/source 

vard := "/home/me/source" 

बराबर के बाद की जगह के बारे में क्या?

उत्तर

14

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

तो, यदि खोल अपेक्षित और उद्धृत स्ट्रिंग की व्याख्या कर सकता है, तो आपको उद्धरणों का उपयोग करना चाहिए। जहां खोल की उम्मीद नहीं है या उद्धृत स्ट्रिंग की सही व्याख्या नहीं करेगा, आपको उद्धरणों का उपयोग नहीं करना चाहिए।

अपने उदाहरणों में, उद्धरण स्वीकार्य हैं या नहीं, इस चर पर निर्भर करता है कि का उपयोग किया जाता है। उपरोक्त के रूप में, उद्धरण के साथ विशेष कुछ भी नहीं करेंगे, जिसका अर्थ है कि vard (उदाहरण के लिए) में शाब्दिक स्ट्रिंग "/home/me/source" (उद्धरण समेत) शामिल है।

आप एक तरह से जहां खोल आप के लिए उद्धरण संभाल लेंगे में है कि मूल्य का उपयोग करते हैं, तो यह ठीक है:

all: ; echo $(vard) 

/home/me/source (कोट के बिना) प्रिंट होगा क्योंकि खोल उन्हें व्याख्या करता है। लेकिन तुम चर लक्ष्य या एक शर्त के रूप में उदाहरण के लिए एक मेकअप संदर्भ में उपयोग करते हैं,:,

all: $(vard) 
$(vard): ; echo [email protected] 

तो यह नहीं सही है क्योंकि लक्ष्य और शर्त शाब्दिक तार "/home/me/source" (उद्धरण शामिल हैं) ।

सामान्य रूप से चर में फ़ाइल नामों के आसपास उद्धरणों का उपयोग नहीं करना सबसे अच्छा है, और इसके बजाय मेक चर के आसपास नुस्खा में उद्धरण जोड़ें। बेशक यदि चर में एक संपूर्ण शेल स्क्रिप्ट है, न केवल एक फ़ाइल नाम, तो आपको स्क्रिप्ट में उपयुक्त उद्धरण जोड़ना चाहिए।

+0

ifequ "$ (varx)" "ए" मेरे लिए भ्रम का आंशिक स्रोत था। – historystamp

+0

इसका एक अपशॉट यह है कि _make_ फ़ाइल नामों में रिक्त स्थान का पालन नहीं कर सकता है। अंतरिक्ष सूची विभाजक है और जैसा कि मैड वैज्ञानिक कहते हैं-उद्धृत नहीं है। _make_ आमतौर पर बेकार टुकड़ों में ऐसे फ़ाइल नाम को तोड़ देता है। – bobbogo

+1

ओपी के इरादे से प्रासंगिक नहीं हो सकता है, लेकिन अन्य उपयोगकर्ता यहां उतर सकते हैं और '$ (VARX)' और _shell variables_ जैसे '$$ {VARZ} 'के बीच भेद को समझ नहीं सकते हैं - डबल डॉलर चिह्न' $ $ 'जो कि उनके बीच _ और so_ के बीच अंतर करने के लिए उपयोग करता है जब आप एक चर के रूप में एक चर के रूप में एक चर चर को पास करना चाहते हैं ** बिना विस्तार के ** ** आप एकल उद्धरण, ईजी का उपयोग करना चाहेंगे:' $ ORIGIN 'गुजरना लिंकर के लिए, फिर 'cc-wl, -rpath =' $$ {ORIGIN} '-shared -fPIC -Wall $ (SRC) -o $ (DIR)/$ (LIB)' का उपयोग करके एकल कोट्स के साथ इसे रखने के लिए खोल में विस्तार –

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