एलएस डुप्लीकेट स्विच क्यों स्वीकार करता है?


16

मैं जिज्ञासु हूँ - क्या कोई अंतर है ls -lऔर ls -lllllllllllllllllllllllllllll?

आउटपुट समान प्रतीत होता है और मैं इस पर उलझन में हूं कि lsडुप्लिकेट स्विच की अनुमति क्यों देता है। क्या यह अधिकांश कमांड के बीच एक मानक अभ्यास है?

जवाबों:


17

संक्षिप्त उत्तर :

क्योंकि यह एक ध्वज के कई उपयोगों को अनदेखा करने के लिए प्रोग्राम किया गया है।

लंबा जवाब:

आप में देख सकते हैं स्रोत कोड की ls, वहाँ समारोह के साथ एक हिस्सा है getopt_long()और एक विशाल स्विच मामला:

1648       int c = getopt_long (argc, argv,
1649                            "abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UXZ1",
1650                            long_options, &oi);
      ....
1654       switch (c)
1655         {
      ....
1707         case 'l':
1708           format = long_format;
1709           break;
      ....
1964     }

फ़ंक्शन getopt_long()प्रोग्राम को दिए गए सभी पैरामटर्स पढ़ता है। मामले में अगर -lचर formatसेट है। इसलिए जब आप -lllllllllएक से अधिक बार टाइप करते हैं तो चर कई बार सेट होता है, लेकिन इससे कुछ भी नहीं बदलता है।

खैर, इससे एक बात बदल जाती है। इस विशाल स्विच केस स्टेटमेंट को कई बार, कई -lझंडे के कारण चलना चाहिए । lsकई -lझंडे के साथ पूरा करने की जरूरत है । लेकिन यह समय ध्यान देने योग्य नहीं है। =)


11
या इसे दूसरे तरीके से रखने के लिए, उन्हें अस्वीकार करना प्रोग्रामर के लिए उन्हें अनदेखा करने से अधिक काम होगा।
मार्क

1
+0.5 यह कहने के लिए कि मैं क्या कहने जा रहा था, स्रोत पर जाने के लिए +0.5।
बजे एक CVn

@ मर्क - प्रोग्रामर के लिए यह अधिक काम क्यों है?
रयान

@Ryan, एक अतिरिक्त "l" विकल्प को अस्वीकार करने के लिए ट्रैकिंग की आवश्यकता होती है कि कितने देखे गए हैं और यदि बहुत अधिक हैं तो त्रुटि संदेश को प्रिंट कर सकते हैं। अतिरिक्त "एल" विकल्पों को अनदेखा करने के लिए बस प्रारूप शैली को "long_format" सेट करने की आवश्यकता होती है, किसी भी समय "l" को देखा जाता है।
मार्क

@ मर्क - मुझे लगा कि एल की गिनती करना आसान होगा और अगर यह 1 से अधिक है, तो एक त्रुटि प्रिंट करें।
रयान

21

क्योंकि यह सही काम है। मान लीजिए कि आपके पास कुछ करने जैसी एक स्क्रिप्ट थी:

ls $LS_OPTIONS -l "$dir"

जहां यह संभव है कि $LS_OPTIONSपहले से ही शामिल है -l। यह इस कमांड के लिए एक त्रुटि उत्पन्न करने के लिए काउंटर-सहज और कष्टप्रद होगा और इसे बचने के लिए स्क्रिप्ट में अतिरिक्त तर्क की आवश्यकता होगी।

-lइसके लिए सबसे अच्छा उदाहरण नहीं हो सकता है, लेकिन उम्मीद है कि आप देख सकते हैं कि अवधारणा सामान्य रूप से कैसे लागू होती है। एक बेहतर उदाहरण संकलक विकल्प हैं $CFLAGSजो संकलक के किसी विशेष आह्वान में स्पष्ट विकल्पों की नकल कर सकते हैं।


4
यही बात तब भी हो सकती है यदि आपने किसी अन्य व्यक्ति को परिभाषित किया है जो lsविकल्पों के कुछ सेट के साथ कॉल करता है।
kasperd

1
@kasperd: हाँ। हालांकि -lअपने lsउपनाम में डालना एक बुरे विचार की तरह लगता है, वही मुद्दा उन विकल्पों के साथ उत्पन्न होने की संभावना है जो कि या lsजैसे एक इंटरैक्टिव उपनाम में अच्छे हैं । -p--color=auto
आर .. गिटहब स्टॉप हेल्पिंग ICE

1
उपनाम को बुलाया जाना नहीं है lsllके लिए एक उपनाम हो सकता है ls -l, और उस उपनाम के साथ एक प्रणाली पर, मैं टाइप कर सकता हूं ll -lart
कास्परड

11

lsएक bashकमांड नहीं है , लेकिन एक अलग निष्पादन योग्य है जो आप से लॉन्च करने के लिए होता है bash। उस ने कहा, -lबस बूलियन ध्वज का एक प्रकार है, जो वर्तमान lsमें आउटपुट के लिए एक लंबी शैली प्रारूप का उपयोग करने का कारण बनता है। अधिकांश कार्यक्रम बस ऐसे झंडे के कई उपयोगों ( जैसे ls -llही हैं ls -l -l) की उपेक्षा करेंगे , हालांकि कुछ अपवाद हैं (उदाहरण के लिए, यदि -v'क्रिया' का अर्थ है, तो एक कार्यक्रम कई अर्थों की व्याख्या कर सकता है जिसका अर्थ है "और भी अधिक क्रिया हो")।


2
का एक उदाहरण -vvvहै ssh
बर्नहार्ड

या यहां तक ​​किaptitude moo
रसल

8

शेल अलायस बहुत कष्टप्रद होगा यदि कमांड जैसे lsदोहराया विकल्पों की अनुमति नहीं देता है।

मान लो तुम्हारे पास था

alias ls='ls --color=auto'
alias rm='rm -i'

फिर, परस्पर विरोधी झंडे की अनुमति नहीं थी, तो यह की तरह इस मुद्दे को आदेशों का एक त्रुटि होगा ls --color=neverया ls --color=autoया rm -i

इसलिए, इन आदेशों को बाद के झंडों को पहले से ओवरराइड करने के लिए डिज़ाइन किया गया है।


संघर्षशील स्विच कभी-कभी अस्वीकृत हो जाते हैं। (दोनों के साथ rsync प्रयास करें --inplaceऔर --delay-updates, उदाहरण के लिए।) कुछ उपकरण बस ले जो कुछ भी पिछले आता है; rm -ifशायद वहाँ एक अच्छा उदाहरण है। लेकिन वहाँ ls के -l विकल्प में कोई विवाद है, इसलिए ls -lऔर ls -llएक समस्या नहीं है, और यह किसी भी महत्वपूर्ण ढंग से निष्पादन प्रभावित नहीं करता। कंप्यूटर मन-सुन्न पुनरावृत्ति में अच्छे हैं।
बजे एक CVn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.