शेल स्क्रिप्ट पर मेक अप का उपयोग क्यों करें?


129

मुझे लगता है कि कमांड लाइन तर्कों की थोड़ी आसान हैंडलिंग के साथ बस एक शेल स्क्रिप्ट है।

इसे .make.sh के बजाय रन बनाने के लिए मानक क्यों है


उल्टे प्रश्न के लिए: मेक ओवर स्क्रिप्ट का उपयोग क्यों करें (क्योंकि कमांड लाइन तर्कों की स्पष्ट आसान हैंडलिंग के कारण), विशेष रूप से सिस्टम प्रशासक कार्यों के लिए, यहां पढ़ें: unix.stackexchange.com/a/497601/1170
lesmana

जवाबों:


126

सामान्य विचार यह है कि make(यथोचित) न्यूनतम रीबिल्ड्स का समर्थन करता है - यानी, आप इसे बताते हैं कि आपके कार्यक्रम के कौन से हिस्से अन्य भागों पर निर्भर हैं। जब आप प्रोग्राम के कुछ हिस्से को अपडेट करते हैं, तो यह केवल उन हिस्सों का पुनर्निर्माण करता है जो उस पर निर्भर करते हैं। जब आप शेल स्क्रिप्ट के साथ ऐसा कर सकते हैं, तो यह बहुत अधिक काम होगा (स्पष्ट रूप से सभी फ़ाइलों पर अंतिम-संशोधित तिथियों की जांच करना, आदि) शेल स्क्रिप्ट के साथ एकमात्र स्पष्ट विकल्प हर बार सब कुछ पुनर्निर्माण करना है। छोटी परियोजनाओं के लिए यह एक पूरी तरह से उचित दृष्टिकोण है, लेकिन एक बड़ी परियोजना के लिए एक पूर्ण पुनर्निर्माण आसानी से एक घंटे या उससे अधिक समय ले सकता है - उपयोग करते हुए make, आप आसानी से एक या दो मिनट में एक ही चीज़ को पूरा कर सकते हैं ...

मुझे शायद यह भी जोड़ना चाहिए कि कम से कम मोटे तौर पर समान क्षमताएं बनाने के लिए काफी कुछ विकल्प हैं। विशेष रूप से ऐसे मामलों में जहां एक बड़ी परियोजना में केवल कुछ फाइलों को फिर से बनाया जा रहा है, उनमें से कुछ (जैसे, निंजा ) अक्सर बनाने के लिए काफी तेज होते हैं।


67

बनाओ एक विशेषज्ञ प्रणाली है

वहाँ विभिन्न चीजें हैं जो शेल स्क्रिप्ट के साथ करना मुश्किल है ...

  • बेशक, यह देखने के लिए जांच करता है कि क्या पुराना है, इसलिए केवल उसी निर्माण के लिए जो इसे बनाने की आवश्यकता है
  • यह एक टोपोलॉजिकल सॉर्ट करता है या कुछ अन्य प्रकार के ट्री विश्लेषण करता है जो यह निर्धारित करता है कि क्या और किस तरह की आउट-ऑफ-डेट चीजों को बनाने के लिए यह निर्भर करता है कि हर निर्भरता से पहले हर शर्त का निर्माण किया जाता है, और केवल एक बार बनाया जाता है।
  • यह घोषणात्मक प्रोग्रामिंग के लिए एक भाषा है । नए तत्वों को एक अनिवार्य नियंत्रण प्रवाह में विलय करने की आवश्यकता के बिना जोड़ा जा सकता है।
  • इसमें नियमों, प्रतिमानों और तारीखों को संसाधित करने के लिए एक अंतर्ग्रहण इंजन होता है, और यह, जब आपके विशेष मेकफाइल में नियमों के साथ संयुक्त होता है, तो यह एक विशेषज्ञ प्रणाली में बदल जाता है
  • इसमें मैक्रो प्रोसेसर है।
  • यह भी देखें: मेकअप के पहले के एक सारांश

2
यह एक विशेषज्ञ प्रणाली के रूप में बहुत सीमित है, हालांकि। उदाहरण के लिए प्रत्येक इंजेक्शन केवल एक बार ही नियम का उपयोग कर सकता है।
रीइनस्टीरपोस्ट

1
बस 2 बिंदु पर विस्तार करने के लिए) अधिक सामान्य इंजीनियरिंग शब्दों में, एक शेल स्क्रिप्ट एक रैखिक क्रम को लागू करता है, जबकि एक मेकाइल पेड़ जैसा होता है। यह अनावश्यक कालानुक्रमिक निर्भरता को हटाता है (हालांकि अभ्यास में प्रक्रिया को रैखिक रूप से निष्पादित किया जाएगा)।
श्रीधर सरनोबत

2
... मुझे लगता है कि शेल स्क्रिप्ट पर मेकफाइल्स के साथ परेशानी जावास्क्रिप्ट पर सीएसएस के साथ परेशानी के अनुरूप है। यह लगभग स्पष्ट नहीं है कि किस कालानुक्रमिक क्रम में प्रत्येक नोड को निष्पादित किया जाता है। हालांकि कम से कम मेकफाइल्स के साथ आपको अभी भी वास्तविक शेल कमांड देखने को मिलता है। सीएसएस के साथ भी वह दूर है।
श्रीधर सरनोबत

मेरे पास कुछ टिप्पणियां हैं जिनकी मैं सराहना करता हूं अगर कोई उन्हें स्पष्ट करता है। 1 / आपके पहले और दो अंक संबंधित नहीं हैं, इस अर्थ में कि टोपोलॉजिकल प्रकार है कि वृद्धिशील निर्माण कैसे निहित है? 2 / क्या आप संख्या 3 को फंक्शन रचना का उपयोग करके लागू नहीं कर सकते हैं। 3 / मैं मेकफाइल एंड यूज़र के लिए 4 और 5 के फायदों के बारे में और अधिक जानना चाहूंगा, और इन फायदों को एक साथ शेल कमांडों को लागू करके लागू क्यों नहीं किया जा सकता है
अमीन हजयूसफ

यह पहली बार है जब मैंने Make में एक एक्सपर्ट सिस्टम के रूप में वर्णन किया है। जैसा कि किसी ने विशेषज्ञ प्रणालियों का निर्माण किया है, यह ऐसा कुछ नहीं है जिसे मैंने माना होगा। स्पष्ट रूप से मेकफाइल में निर्दिष्ट घोषणात्मक नियमों के माध्यम से अपने कार्यक्रम का निर्माण करने के तरीके को कम करने के लिए एक इंट्रेंस इंजन है, लेकिन यह कम स्पष्ट है कि यह एक ज्ञान आधारित प्रणाली है क्योंकि (पत्ती) नियम शेल कमांड हैं जिन्हें तथ्यों के बजाय निष्पादित किया जाना है। और "विशेषज्ञ प्रणाली" शब्द का उपयोग एक ऐसी प्रणाली को संदर्भित करने के लिए किया जाता है जिसने विश्व स्तर के विशेषज्ञ की विशेषज्ञता को सफलतापूर्वक कब्जा कर लिया है, जो कि मामला नहीं है। जूरी अभी भी मेरे लिए बाहर है।
डेनिस

9

सुनिश्चित करें कि जब आप अपने स्रोत फ़ाइलों में परिवर्तन करते हैं, तो केवल आवश्यक फ़ाइलें recompiled हैं।

उदाहरण के लिए:

final : 1.o 2.o
    gcc -o final 1.o 2.o

1.o : 1.c 2.h
    gcc -c 1.c

2.o : 2.c 2.h
    gcc -c 2.c

अगर मैं 2.hकेवल फ़ाइल बदलूं और चलाऊंmake , तो यह सभी 3 कमांड्स को रिवर्स ऑर्डर में निष्पादित करता है।

अगर मैं 1.cकेवल फ़ाइल बदलूं और चलाऊंmake , तो यह उल्टे क्रम में केवल पहले 2 कमांड निष्पादित करता है।

यह पूरा करने की कोशिश कर रहा है कि आपकी स्वयं की शेल स्क्रिप्ट में बहुत सारी if/elseजाँच शामिल होगी ।


या rsync -r -c -I $SOURCE $DEST_DIRशेल में कुछ इस तरह का उपयोग करें ।
स्पार्टाकस

9

साथ ही उपरोक्त, मेक एक घोषणात्मक (-ish) समानांतर प्रोग्रामिंग भाषा है।

मान लीजिए कि आपके पास कन्वर्ट करने के लिए 4,000 ग्राफिक फाइलें और 4 सीपीयू हैं। एक 10-लाइन शेल स्क्रिप्ट लिखने की कोशिश करें (मैं यहां उदार हो रहा हूं) जो आपके सीपीयू को संतृप्त करते हुए मज़बूती से करेगा।

शायद असली सवाल यह है कि लोग शेल स्क्रिप्ट लिखने से क्यों कतराते हैं।


1
हां, आप कुल लीनियर ऑर्डर को अधिक ट्री-जैसे ऑर्डर में ढीला कर रहे हैं।
श्रीधर सरनोबत

4

हैंडल निर्भरताएं बनाएं: मेकफाइल उनका वर्णन करता है: बाइनरी ऑब्जेक्ट फ़ाइलों पर निर्भर करती है, प्रत्येक ऑब्जेक्ट फ़ाइल एक स्रोत फ़ाइल और हेडर पर निर्भर करती है ... जब मेक रन किया जाता है, तो फ़ाइलों की तारीख की तुलना यह निर्धारित करने के लिए की जाती है कि फिर से संकलित किए जाने की आवश्यकता क्या है। ।

एक सीधे Makefile में वर्णित सब कुछ का निर्माण नहीं करने के लिए एक लक्ष्य को लागू कर सकते हैं।

इसके अलावा वाक्य रचना प्रतिस्थापन, vpath प्रदान करता है

यह सब शेल स्क्रिप्ट्स में लिखा जा सकता है, जिसके साथ आपके पास पहले से ही है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.