नेकेड डायरेक्टरी निर्माण के लिए mkdir में डिफ़ॉल्ट रूप से -p फ्लैग सेट क्यों नहीं है?


11

मुझे कोई कारण नहीं दिख रहा है कि -pध्वज को mkdirडिफ़ॉल्ट रूप से सेट क्यों नहीं किया जाना चाहिए।

  -p, --parents     no error if existing, make parent directories as needed

यह एक गैर-विनाशकारी आदेश है जो मैं देख सकता हूं। क्या मैं इस काम के तरीके के बारे में कुछ महत्वपूर्ण याद कर रहा हूं?

दूसरी बात यह है कि यह डिफ़ॉल्ट व्यवहार होने का एक आसान तरीका है mkdir?


2
इसे अपने .bashrc में डालें alias mkdir="mkdir -p":।
केविन

सभी चर्चा के बाद मैंने mkdp
ट्रेफिनॉन

जवाबों:


6

यह एक वैकल्पिक विशेषता है, जो हमेशा वांछित नहीं होती है - विशेष रूप से लिपियों में। लिपियों के मामले में निम्नलिखित कमियों पर विचार करें:

  • यह तथ्य कि निर्देशिका पहले से मौजूद है, रिपोर्ट नहीं की गई है: यदि कोई स्क्रिप्ट किसी नई बनाई गई निर्देशिका में कुछ फ़ाइलों को रखने वाली है और उस निर्देशिका में पहले से मौजूद है और उसमें फ़ाइलें हैं, तो स्क्रिप्ट बहुत गड़बड़ कर सकती है। (यह स्क्रिप्ट के बाद वहां रखी गई फ़ाइलों को फ़िल्टर करने के लिए खतरनाक होगा।)
  • उपरोक्त के फ्लिप-साइड पर, कुछ स्क्रिप्ट (या इस तरह का हिस्सा) पहले बनाई गई निर्देशिका संरचना पर निर्भर हो सकती है (संभवतः अन्य पैकेज / स्क्रिप्ट द्वारा)। उदाहरण के लिए, एक पैकेज इंस्टॉलेशन स्क्रिप्ट को लाइब्रेरी को एक सबडिर में रखने की आवश्यकता हो सकती है /usr/local/lib/GreatSoftware/ImportantPartOfIt, लेकिन लाइब्रेरियों के तहत सामान के लिए / लिंक पर निर्भर करता है /usr/local/lib/GreatSoftware। यदि यह गायब है, तो स्क्रिप्ट जारी नहीं रहनी चाहिए।

इस mkdirतरह की स्थितियों की सूचना दी जाती है और इसे सीधे पकड़ा जा सकता है, क्योंकि यह सामान्य और आसान बनाता है।


यदि आप हमेशा mkdir -pअपने गोले में उपयोग करना चाहते हैं, तो आप इसके लिए एक उपनाम बना सकते हैं :

alias mkdir='mkdir -p'

(यह आपके .bashrcया जो भी आपके शेल का उपयोग करता है, उस पर जाना चाहिए ।)


1
मैं इसे एक गैर मानक तरीके से व्यवहार करने के लिए एक मानक कमांड को अन्य नाम देने का सुझाव नहीं दूंगा। यह स्क्रिप्ट को गैर-पोर्टेबल बना देगा और पाठकों को भ्रमित कर सकता है। एक नया उपनाम या फ़ंक्शन बनाना, जैसे alias mkdp="mkdir -p"अधिक उचित होगा।
जूलियाग्रे

2
@jlliagre नहीं, यह लिपियों को प्रभावित नहीं करेगा। उपनाम स्थानीय रूप से परिभाषित .bashrc(सामान्य रूप से) उनके वातावरण को प्रभावित नहीं करते हैं।
rozcietrzewiacz

सचमुच, लेकिन आप मेरी बात से चूक गए। अपने स्वयं के उपयोग के लिए भी, अपने व्यवहार को बदलने के लिए एक मानक आदेश का पालन करना एक अनुशंसित अभ्यास नहीं है। सबसे बुरा उदाहरण सर्वव्यापी है alias rm='rm -i'
जूलियाग्रे

1
@jlliagre किसके द्वारा अनुशंसित नहीं है? ;) लेकिन हां, मैं सहमत हूं, मैं खुद एक अलग उपनाम का उपयोग करूंगा - लेकिन व्यावहारिक रूप से, वैचारिक कारणों से नहीं। मैं यह भी नहीं सोचता कि rm -iउपनाम हमेशा बुरा होता है - हालांकि बुरी आदतें हो सकती हैं। निश्चित रूप से सभी कमांड उपनाम समान रूप से अच्छे / बुरे नहीं हैं - विचार करें ls="ls --color=auto"या ssh="TERM=xterm ssh"उदाहरण के लिए।
rozcietrzewiacz

मेरी सिफारिश में कुछ भी वैचारिक नहीं है। आरएम उर्फ ​​अप्रत्यक्ष रूप से कई खोई हुई फाइलों के लिए जिम्मेदार है (मैं इस उपनाम के पीड़ितों से बहुत मिल चुका हूं)। मैं mkdir पर संदेह कर रहा था, बहुत कम हद तक, अवांछित दुष्प्रभाव। बेशक, मैं कॉस्मेटिक के खिलाफ नहीं हूं, व्यवहार नहीं, आपके ssh और ls उदाहरणों की तरह परिवर्तन।
जूलियाग्रे

16

बेशक कोई यह तर्क दे सकता है कि मूल निर्देशिका निर्माण डिफ़ॉल्ट होना चाहिए और कुछ चेक विकल्प का उपयोग निर्देशिका निर्माण को रोकने के लिए किया जा सकता है यदि माता-पिता मौजूद नहीं हैं।

लेकिन इसका कारण यह है कि इसका दूसरा तरीका सिर्फ इतिहास है। के मूल संस्करण mkdir माता पिता निर्देशिका का निर्माण नहीं किया। यही कारण है कि X11 वितरण mkdirhier नामक एक कमांड के साथ आया था जो इस कार्य को पूरा करने में सक्षम था: यह जांचें कि क्या माता-पिता निर्देशिका मौजूद हैं और यदि neccessary है तो उन्हें बनाएं।

बाद में इस कार्यक्षमता को कई UNIX संस्करणों पर कमांड mkdir में जोड़ा गया था (मुझे नहीं पता कि यह आजकल POSIX मानक में है)। अनुकूलता बनाए रखने के लिए यह सुविधा एक विकल्प ध्वज को चालू करके उपलब्ध कराई गई थी -p:।

इसे डिफ़ॉल्ट रूप से चालू करना क्यों बुरा है? यदि मूल निर्देशिका मौजूद नहीं है तो लिपियों में mkdir विफल होने पर निर्भर हो सकता है। विशेष रूप से उपयोगकर्ता रूट के रूप में डिफ़ॉल्ट रूप से निर्देशिका पेड़ों को बनाना खतरनाक हो सकता है।

उदाहरण:

 if mkdir /backup/$(uname -n)/$(date +%Y%m%d)
  then
    perform_backup ...

इस उदाहरण में डायरेक्टरी बनाई जाएगी और जो बैकअप दिया गया है, वह भी फाइलसिस्टम /backupमाउंट नहीं है और अभिभावक /backup/$(uname -n)मौजूद नहीं है, तो डिफ़ॉल्ट अन्य तरीके से होगा।

अंगूठे का नियम: किसी भी टूल के डिफ़ॉल्ट व्यवहार को नहीं बदलना अच्छा अभ्यास है। यदि वांछित व्यवहार डिफ़ॉल्ट व्यवहार को बदलने की अनुमति देने के लिए विकल्प प्रदान करता है।


2
मुझे आपके द्वारा उपयोग किया गया माउंट उदाहरण पसंद है। मैंने उस विशेष परिदृश्य के बारे में नहीं सोचा था।
ट्रेफिनॉन

1
1983 में सिस्टम V द्वारा -p (और -m) विकल्प पेश किए गए थे। दोनों निश्चित रूप से POSIX मानक का हिस्सा हैं।
jlliagre

4

मुझे लगता है, यह थोथा दर्शन है। नंगे mkdir (1) कमांड (विकल्प के बिना) mkdir (2) सिस्टम कॉल का प्रतिनिधित्व करता है , शेल में इसकी कार्यक्षमता प्रदान करता है, अधिक या कम कुछ नहीं कर रहा है।


4

में शुरुआत , वहाँ केवल नंगे था mkdirआदेश। यूनिक्स के डिजाइन सिद्धांतों के अनुसार, इस सरल कमांड ने एक सरल कार्य किया: एक निर्देशिका बनाना।

बाद में, एक सामान्य उपयोग के मामले को संभालने के लिए mkdirएक -pविकल्प का अधिग्रहण किया जहां कॉलर शून्य बनाना चाहता है, एक या अधिक निर्देशिका यह सुनिश्चित करने के लिए कि एक विशेष पथ मौजूद है। इसे कई कारणों से डिफ़ॉल्ट ऑपरेशन नहीं बनाया गया था। सबसे पहले, सभी प्रणालियों में यह अधिक जटिल विशेषता नहीं थी, और -pविकल्प की आवश्यकता होती थी, जिसका अर्थ था कि इसका इस्तेमाल करने वाली लिपियों mkdir: invalid option -zको कभी-कभी निर्देशिका बनाने में अजीब तरह से विफल होने के बजाय एक उचित त्रुटि संदेश (कुछ ऐसा ) मिलेगा । दूसरा, और सबसे महत्वपूर्ण बात, का व्यवहार सभी मामलों में mkdir -pसंगत प्रतिस्थापन नहीं है mkdir

विशेष रूप से, अधिकांश फाइल सिस्टम पर, mkdirएक परमाणु संचालन होता है । यदि कोई प्रोग्राम चलता है mkdir playgroundऔर कमांड सफल होता है, तो प्रोग्राम को पता है कि उसने playgroundडायरेक्टरी बनाई है । यह प्रोग्राम को नई निर्देशिका को उसके अनन्य खेल के मैदान के रूप में मानने की अनुमति देता है: यदि उसी प्रोग्राम का एक और उदाहरण समवर्ती चल रहा है, तो उसका कॉल mkdir playgroundविफल हो जाएगा। यह संपत्ति स्पष्ट रूप से प्रदान नहीं की गई है mkdir -pक्योंकि यह तर्क को अस्तित्व में लाने की अनुमति देता है।

यदि mkdir -pशुरुआत से ही अस्तित्व में था, तो इसे डिफ़ॉल्ट मोड बनाया जा सकता था, जिसमें mkdir -aसिंगल-डायरेक्टरी क्रिएशन कमांड के लिए कुछ था। लेकिन यह कि सामान्य यूनिक्स डिजाइन दर्शन का पालन नहीं किया गया होगा: सबसे बुनियादी उपयोगिताओं अंतर्निहित प्राइमेटिव के आसपास सरल आवरण हैं, हठधर्मी व्यवहार (जैसे एक ही बार में कई निर्देशिकाएं बनाना) फैंसी विकल्पों की आवश्यकता होती है।


2

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

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

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