साथ में:
FILES = $(shell ls)
इस all
तरह के नीचे इंडेंट , यह एक बिल्ड कमांड है। तो यह फैलता है $(shell ls)
, फिर कमांड चलाने की कोशिश करता है FILES ...
।
यदि FILES
एक make
चर माना जाता है , तो इन चर को नुस्खा भाग के बाहर सौंपा जाना चाहिए, जैसे:
FILES = $(shell ls)
all:
echo $(FILES)
बेशक, इसका मतलब है कि .tgz फ़ाइलों को बनाने वाली किसी भी कमांड को चलाने FILES
से पहलेls
" से आउटपुट" पर सेट किया जाएगा । (हालांकि के रूप में Kaz नोटों चर हर बार फिर से विस्तार किया गया है, इसलिए अंत में यह .tgz फ़ाइलों को शामिल करेगा, कुछ मेकअप विविधताएं हैं FILES := ...
दक्षता और / या शुद्धता के लिए इस से बचने के लिए,। 1 )
यदि FILES
शेल चर माना जाता है, तो आप इसे सेट कर सकते हैं, लेकिन आपको शेल-एईएस में करने की आवश्यकता है, जिसमें कोई स्थान नहीं है, और उद्धृत किया गया है:
all:
FILES="$(shell ls)"
हालाँकि, प्रत्येक पंक्ति एक अलग शेल द्वारा चलाई जाती है, इसलिए यह चर अगली पंक्ति तक नहीं टिकेगा, इसलिए आपको इसे तुरंत उपयोग करना चाहिए:
FILES="$(shell ls)"; echo $$FILES
यह सब थोड़ा मूर्खतापूर्ण है क्योंकि *
पहली बार में आपके लिए शेल (और अन्य शेल ग्लोब एक्सप्रेशन) का विस्तार होगा , इसलिए आप निम्न कर सकते हैं:
echo *
अपने शेल कमांड के रूप में।
अंत में, एक सामान्य नियम के रूप में (वास्तव में इस उदाहरण पर लागू नहीं होता है): जैसा कि टिप्पणियों में एस्परेंटो नोट करता है, से आउटपुट का उपयोग ls
पूरी तरह से विश्वसनीय नहीं है (कुछ विवरण फ़ाइल नामों पर निर्भर करते हैं और कभी-कभी संस्करण भी ls
; ls
आउटपुट को सैनिटाइज़ करने के प्रयास के कुछ संस्करण; कुछ मामलों में)। इस प्रकार, l0b0 और आइडियल नोट के रूप में, यदि आप GNU का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं $(wildcard)
और स्वयं के $(subst ...)
अंदर सब कुछ पूरा कर सकते हैं make
(फ़ाइल नाम में किसी "अजीब पात्रों से बचना")। ( sh
स्क्रिप्ट में, मेकफाइल्स के रेसिपी भाग सहित, एक अन्य विधि का उपयोग find ... -print0 | xargs -0
ब्लैंक, न्यूलाइन, कंट्रोल कैरेक्टर और इसी तरह ट्रिपिंग से बचने के लिए किया जाता है।)
1 GNU दस्तावेज़ नोट करें कि POSIX ::=
2012 में अतिरिक्त असाइनमेंट बनाये । मुझे इसके लिए एक POSIX दस्तावेज़ का त्वरित संदर्भ लिंक नहीं मिला है, और न ही मुझे पता है कि कौन से make
वेरिएंट ::=
असाइनमेंट का समर्थन करते हैं , हालांकि GNU आज भी करता है, जिसका अर्थ है कि :=
, विस्तार के साथ अभी असाइनमेंट करें।
ध्यान दें कि कई वेरिएंट में VAR := $(shell command args...)
वर्तनी भी हो सकती है , जिसमें सभी आधुनिक GNU और BSD वेरिएंट शामिल हैं जहाँ तक मुझे पता है। इन अन्य वेरिएंट का उपयोग नहीं किया जाता है, दोनों छोटे होने और अधिक वेरिएंट में काम करने में बेहतर है।VAR != command args...
make
$(shell)
VAR != command args...
ls
साथsed
) का उपयोग करना चाहता हूं , और फिर rsync और अन्य कमांड में परिणामों का उपयोग करना चाहता हूं । क्या मुझे बार-बार लंबी कमांड दोहरानी होगी? क्या मैं परिणामों को आंतरिक मेक वैरिएबल में संग्रहीत नहीं कर सकता हूं?