कमांड विकल्पों की पूर्वता?


21

मुझे पता है कि rm -f file1जबरदस्ती file1मुझे हटाए बिना हटा दिया जाएगा ।

मुझे यह भी पता है कि rm -i file1हटाने से पहले मुझे तुरंत संकेत देना होगाfile1

अब यदि आप अमल करते हैं rm -if file1, तो यह भी file1बिना मुझे बताए जबरदस्ती हटा देगा ।

हालाँकि, यदि आप निष्पादित करते हैं rm -fi file1, तो यह मुझे हटाने से पहले संकेत देगा file1

तो क्या यह सही है कि जब कमांड विकल्पों का संयोजन किया जाता है, तो अंतिम क्या पूर्वता लेगा? जैसे rm -if, तब -fपूर्वता लेंगे, लेकिन rm -fiतब -iइच्छा पूर्वता लेंगे।

lsउदाहरण के लिए आदेश में, यह कोई फर्क नहीं पड़ता अगर आप ने कहा कि ls -latRया ls -Rtal

इसलिए मुझे लगता है कि यह केवल तभी मायने रखता है जब आपके पास विरोधाभासी आदेश विकल्प होते हैं rm -if, क्या यह सही है?


जवाबों:


23

rmदोनों -iऔर -f विकल्पों के साथ उपयोग करते समय, पहले वाले को अनदेखा किया जाएगा। यह POSIX मानक में प्रलेखित है :

    -f
       Do not prompt for confirmation. Do not write diagnostic messages or modify
       the exit status in the case of nonexistent operands. Any previous
       occurrences of the -i option shall be ignored.
    -i
       Prompt for confirmation as described previously. Any previous occurrences
       of the -f option shall be ignored.

और GNU infoपेज में भी :

‘-f’
‘--force’

    Ignore nonexistent files and missing operands, and never prompt the user.
    Ignore any previous --interactive (-i) option.

‘-i’
    Prompt whether to remove each file. If the response is not affirmative, the
    file is skipped. Ignore any previous --force (-f) option.

देखते हैं कि हुड के नीचे क्या होता है:

rmgetopt(3)विशेष रूप से इसके विकल्प को संसाधित करता है getopt_long। यह फ़ंक्शन कमांड लाइन में विकल्प तर्क को संसाधित करेगा ( **argv) उपस्थिति के क्रम में:

यदि गेटॉप () को बार-बार कहा जाता है, तो यह प्रत्येक विकल्प तत्वों में से प्रत्येक विकल्प अक्षर के क्रमिक रूप से लौटता है।

इस फ़ंक्शन को आम तौर पर एक लूप में कहा जाता है जब तक कि सभी विकल्पों को संसाधित नहीं किया जाता है। इस फ़ंक्शन के दृष्टिकोण से, विकल्पों को क्रम में संसाधित किया जाता है। हालांकि, वास्तव में क्या होता है, यह अनुप्रयोग पर निर्भर है, क्योंकि आवेदन तर्क परस्पर विरोधी विकल्पों का पता लगाने के लिए चुन सकता है, उन्हें ओवरराइड कर सकता है, या एक त्रुटि प्रस्तुत कर सकता है। के मामले के लिए rmऔर iऔर fविकल्प, वे पूरी तरह से अधिलेखित eachother। से rm.c:

234         case 'f':
235           x.interactive = RMI_NEVER;
236           x.ignore_missing_files = true;
237           prompt_once = false;
238           break;
239 
240         case 'i':
241           x.interactive = RMI_ALWAYS;
242           x.ignore_missing_files = false;
243           prompt_once = false;
244           break;

दोनों विकल्प समान चर निर्धारित करते हैं, और इन चरों की स्थिति कमांड लाइन में अंतिम विकल्प होगा। इसका प्रभाव POSIX मानक और rmप्रलेखन के साथ इनलाइन है ।


3
अधिकांश कमांड क्रम में अपने args की प्रक्रिया करते हैं, और या तो संघर्षों पर त्रुटि करते हैं या अंतिम सेटिंग (जैसे rm) लेते हैं । मुझे लगता है कि किसी विकल्प की पहली सेटिंग लेने के लिए यह एक आदेश के लिए दुर्लभ है, और आर्ग्स को अनदेखा करता है जो पहले से ही सेट विकल्प को बदल देगा।
पीटर कॉर्ड्स

7

हां, इसके लिए rmयह मान्य है। यदि अंतिम विकल्प पिछले वाले को ओवरराइड करता है, हालांकि व्यक्तिगत कार्यक्रम पर निर्भर करता है। Frominfo rm´ से

'-f' '--force' कोई भी फ़िज़ूल फ़ाइल और अनुपलब्ध ऑपरेंड को अनदेखा न करें, और उपयोगकर्ता को कभी संकेत न दें। किसी भी पिछले '- इनएक्टिव' ('-i') विकल्प को अनदेखा करें।

'-i' प्रॉम्प्ट करें कि क्या प्रत्येक फ़ाइल को निकालना है। यदि प्रतिक्रिया सकारात्मक नहीं है, तो फ़ाइल को छोड़ दिया जाता है। किसी भी पिछले '--force' ('-f') विकल्प को अनदेखा करें। '- सदैव = हमेशा' के बराबर।

एक सामान्य संकेत के रूप में: infoआमतौर पर की तुलना में अधिक विस्तृत होता है man, जो स्वयं आमतौर पर --helpविकल्प से अधिक विस्तृत होता है।


7

झंडे के लिए कोई "पूर्वता" नहीं है, प्रत्येक कार्यक्रम उन्हें अपनी इच्छानुसार संभालता है। अधिकांश सभी झंडे को इकट्ठा करने और संघर्षों के लिए जांच करने के लिए कुछ प्रयास करते हैं, मानक उपकरण (जैसे संदर्भित rm(1)) के लिए प्रासंगिक मानक कुछ जनादेश दे सकते हैं (लेकिन फिर, मानक के कोने के मामलों की व्याख्या करने में आपका विशेष संस्करण मैला हो सकता है / विशेष रूप से परीक्षण नहीं किया गया है) उनके लिए)।

प्रोग्रामर लिखने वाले प्रोग्रामर के लिए, बाएं से दाएं क्रम में तर्क (झंडे और अन्य) पर विचार करना सबसे आसान है, और शायद कुछ रोड़ा टकराने पर बाहर निकलता है। यदि झंडे को संभालने के लिए लाइब्रेरी का उपयोग किया जाता है (जैसे getopt(3), वहाँ कई संस्करण तैर रहे हैं) प्रोग्रामर संभवतः वही करता है जो सबसे आसान / प्राकृतिक आता है। प्रोग्रामर लोग हैं, लोग आलसी हैं (या कम से कम दहनशील विस्फोट के माध्यम से सोचने के शौकीन नहीं हैं)।

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