यह वास्तव में कमांड को निष्पादित कर रहा है, निर्देशिका को बदलकर some_directory
, हालांकि, यह एक सब-प्रोसेस शेल में किया जाता है, और आप जिस शेल से काम कर रहे हैं उसे न तो बनाते हैं और न ही प्रभावित करते हैं।
यदि आप अधिक कार्य करना चाहते हैं some_directory
, तो आपको एक अर्ध-उपनिवेश जोड़ने की आवश्यकता है और साथ ही अन्य आदेशों को जोड़ना होगा। ध्यान दें कि आप नियम के अंत के रूप में व्याख्या के रूप में उपयोग नहीं कर सकते हैं, इसलिए स्पष्टता के लिए आपके द्वारा उपयोग किए जाने वाले किसी भी नए समाचार को बैकस्लैश से बचना होगा।
उदाहरण के लिए:
all:
cd some_dir; echo "I'm in some_dir"; \
gcc -Wall -o myTest myTest.c
ध्यान दें कि हर आदेश के बीच अर्धविराम आवश्यक है, भले ही आप बैकस्लैश और एक नई पंक्ति जोड़ते हैं। यह इस तथ्य के कारण है कि पूरे स्ट्रिंग को शेल द्वारा एकल लाइन के रूप में पार्स किया गया है। जैसा कि टिप्पणियों में उल्लेख किया गया है, आपको कमांड में शामिल होने के लिए '&&' का उपयोग करना चाहिए, जिसका अर्थ है कि वे केवल निष्पादित होते हैं यदि पूर्ववर्ती आदेश सफल था।
all:
cd some_dir && echo "I'm in some_dir" && \
gcc -Wall -o myTest myTest.c
विनाशकारी काम करते समय यह विशेष रूप से महत्वपूर्ण है, जैसे कि सफाई, जैसा कि आप अन्यथा गलत सामान को नष्ट कर देंगे, ऐसा होना चाहिए cd
जो भी कारण के लिए विफल ।
हालांकि, उप-निर्देशिका में कॉल करने के लिए एक सामान्य उपयोग है, जिसे आप देखना चाहते हैं। इसके लिए एक कमांड लाइन विकल्प है, ताकि आपको cd
खुद को कॉल न करना पड़े , इसलिए आपका नियम इस तरह दिखाई देगा
all:
$(MAKE) -C some_dir all
जो "सभी" लक्ष्य के साथ वहाँ बदल जाएगा some_dir
और Makefile
वहाँ पर अमल करेगा । सर्वोत्तम अभ्यास के रूप में, सीधे $(MAKE)
कॉल करने के बजाय उपयोग करें make
, क्योंकि यह सही मेक इंस्टेंस को कॉल करने के लिए ध्यान रखेगा (यदि आप, उदाहरण के लिए, अपने बिल्ड वातावरण के लिए एक विशेष मेक संस्करण का उपयोग करें), और साथ ही साथ चलने पर थोड़ा अलग व्यवहार प्रदान करें कुछ स्विच का उपयोग करना, जैसे कि -t
।
रिकॉर्ड के लिए, इसे हमेशा निष्पादित करें कमांड को निष्पादित करें (जब तक कि स्पष्ट रूप से दबाया न जाए), भले ही इसका कोई आउटपुट न हो, जो कि आप देख रहे हैं।
make
, मैं कभी इस तरह निर्देशिका को बदलना नहीं चाहता था। शायद आपको अपने समाधान के लिए एक और दृष्टिकोण की कोशिश करनी चाहिए?