Cp और mkdir के बजाय इंस्टॉल का उपयोग क्यों करें?


66

मैंने कई जगहों पर install -dडायरेक्ट्रीज़ बनाने और install -cएक फाइल कॉपी करने के लिए इस्तेमाल किया है । क्यों नहीं उपयोग mkdirऔर cp? क्या उपयोग करने में कोई फायदा है install?

जवाबों:


57

यह इस बात पर निर्भर करता है कि आप क्या कर रहे हैं।

installआदेश सामान्य रूप से स्थापना स्क्रिप्ट संकुल और अपने सिस्टम के लिए एक द्विआधारी स्थापित करने के लिए स्रोत कोड के साथ आए में प्रयोग किया जाता है। इसका उपयोग किसी अन्य फ़ाइल या निर्देशिका को स्थापित करने के लिए भी किया जा सकता है। के अलावा -dऔर -cविकल्प आपके पास -mफ़ाइल के नए अनुमतियाँ निर्दिष्ट करने के लिए स्थापित किया जाना है, तो आप एक ऐसा करने के लिए नहीं है cpऔर एक chmodही परिणाम प्राप्त करने के लिए। उदाहरण के लिए:

install -m644 "$srcdir/$pkgname-$pkgver-linux64" "$pkgdir/opt/$pkgname"

तुम भी विकल्प हैं -gऔर -oक्रमश: लक्ष्य समूह और मालिक, स्थापित करने के लिए। यह अलग कॉल से बचा जाता है chown। सामान्य तौर पर, installअपनी स्क्रिप्ट का उपयोग करते हुए और कई के बजाय एक ही आदेश में फ़ाइल निर्माण, कॉपी, मोड सेटिंग और संबंधित सामान करके इसे अधिक संक्षिप्त बनाता है।

संदर्भ के लिए, देखें man install। उपयोग के लिए, बस कुछ पैकेज सोर्स कोड के साथ शिप की गई किसी भी इंस्टॉलेशन स्क्रिप्ट को देखें ।


21

"इंस्टॉल" आम तौर पर निम्नलिखित कार्यों को जोड़ती है:

  • निर्दिष्ट फ़ाइल को लक्ष्य स्थान पर कॉपी करना, जो एक पुरानी कॉपी का उपयोग करने वाली प्रक्रियाओं के संबंध में किया जा रहा है। "Cp" के विपरीत, "इनस्टॉल" या तो एक नए के निर्माण से पहले फाइल को अनलिंक करता है, या (BSD सिस्टम में, -S स्विच के साथ) एक नया बनाता है और लक्ष्य नाम पर परमाणु नाम देता है, जो स्थापित करने और फिर से खोलने के बीच दौड़ की स्थिति से बचा जाता है। । यदि इसका उपयोग नहीं करना है, तो चल रही बाइनरी फ़ाइल के लिए प्रतिलिपि बनाना (ETXTBSY के साथ) विफल हो सकता है, या लाइब्रेरी फ़ाइल या डेटा को प्रतिस्थापित करने पर क्रैश का कारण बन सकता है।
  • अलग कमांड की आवश्यकता के बिना नई फ़ाइल के लिए उचित क्रेडेंशियल्स सेट करें।
  • अनुरोध किए जाने पर मध्यवर्ती निर्देशिकाएं बनाएं।
  • यदि यह नए संस्करण (-सी स्विच) के समान है तो लक्ष्य फ़ाइल को संशोधित करने से बचें।

इसलिए, यह यूनिक्स के दृष्टिकोण का अनुसरण करता है कि एक उपकरण को कुछ निर्माण उपकरण द्वारा बनाई गई फ़ाइल को उसके कार्य स्थान पर स्थापित करने की एक पूरी लेकिन कार्रवाई के लिए बनाया जाएगा।

जैसा कि मैंने वर्णन किया है पूरी अवधारणा बीएसडी सिस्टम (तथाकथित "xinstall" संस्करण में लागू की गई है); मैं इसके लिए "सुरक्षित प्रतिलिपि" मोड (परमाणु नामकरण के साथ नया संस्करण) को महत्वपूर्ण मानता हूं। लिनक्स सिस्टम (कोरुटिल्स से) इस महत्वपूर्ण हिस्से को याद करते हैं और एक बायोडर प्रक्रिया द्वारा हटाने और फिर से खोलने के बीच दौड़ के लिए प्रवण होते हैं; लेकिन यह पैकेज प्रबंधकों द्वारा कवर किया जा सकता था।


2
installया $(INSTALL)मेकफाइल्स के उपयोग में उन चरणों को भी शामिल किया जाता है, जैसा कि इंस्टॉलेशन कॉपी करने वाले स्टेप्स होते हैं, न कि कुछ साधारण कॉपी करने वाले स्टेप्स। यह उपयोगी हो सकता है।
कज़

मैं स्थापित कर रहे हैं coreutils में दौड़ का सामना कर रहा हूँ ... वहाँ एक तय है, या एक विकल्प है जो यह सही ढंग से करता है?
ट्रेंट

@tww किस तरह की दौड़?
नेट

8

इसके अलावा पिछले विवरण यहाँ उपयोग के बारे में से, वहाँ के बीच एक निम्न स्तर का अंतर है cpऔर installकम से कम लिनक्स पर। यदि किसी मौजूदा फ़ाइल पर कॉपी की जाती है, तो फ़ाइल cpके मौजूदा इनकोड को ओवरराइट करता है, जबकि installहमेशा एक ही फ़ाइल नाम के लिए एक नया इनकोड बनाता है।

रनिंग बाइनरी के नए संस्करण को स्थापित करते समय यह एक अंतर बनाता है। सफल होने के cpदौरान एक EBUSY त्रुटि का कारण बनता है install। रनिंग बाइनरी अभी भी पुराने संस्करण का उपयोग करेगा, लेकिन नए संस्करण का उपयोग किया जाता है यदि प्रोग्राम को पुनरारंभ किया जाता है।


यह दिलचस्प है ... तो यह एक ही नाम के साथ एक फ़ाइल बना सकता है, लेकिन अलग इनोड?
नियू ओविदियु गेब्रियल

1
@ Nea NuOvidiuGabriel हाँ। उपयोगकर्ता के लिए, केवल एक फ़ाइल होगी, क्योंकि फ़ाइलों को आमतौर पर नाम से देखा जाता है। लेकिन फाइल सिस्टम में, दो फाइलें हैं जब तक कि कोई प्रक्रिया पुरानी फाइल का संदर्भ रखती है। यदि आप एक प्रक्रिया द्वारा खोली गई फ़ाइल का नाम बदलते हैं या हटाते हैं, और फिर उसी फ़ाइल नाम के साथ एक नई फ़ाइल बनाते हैं तो इसे प्राप्त किया जा सकता है।
टॉमस स्कारे

4

यदि प्रश्न में निर्देशिका पहले से मौजूद है:

  • mkdir -p स्वामित्व और फ़ाइल मोड बिट्स सेट करने का प्रयास करेंगे
  • install -d स्वामित्व और फ़ाइल मोड बिट्स सेट करने का प्रयास नहीं करेंगे

इस के लिए है mkdirऔर installसे GNU coreutils । वे दोनों एक ही make_dir_parentsफ़ंक्शन का उपयोग करते हैं, लेकिन preserve_existingपैरामीटर के साथ क्रमशः सेट falseया किया जा रहा trueहै।


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