चामोद और -आर + आर


13

मैंने गलत क्रम में कमांड चामोद को कॉल करने की कोशिश की है। chmod file.txt -rयह किसी कारण के लिए काम किया। chmod file.txt +rदूसरी ओर काम करने से मना कर दिया। ऐसा क्यों है? किस कारण से एक कमांड काम करता है, और दूसरा नहीं?

जवाबों:


18

यह एक quirk है कि GNU chmod इनपुट को कैसे संभालता है, और सभी POSIX- संगत chmod कार्यान्वयन के लिए पोर्टेबल नहीं है।

ध्यान दें कि POSIXchmod coomand- लाइन सिंटैक्स को पहले आने के लिए मोड की आवश्यकता होती है, जैसा कि GNUchmod (विकल्प मोड से पहले भी आना चाहिए)। और कुछ भी एक अनिर्दिष्ट कार्यान्वयन क्वर्क है।


अब, इस विशेष कार्यान्वयन में ऐसा क्यों होता है:

यह मैनुअल में संकेत दिया गया है :

आमतौर पर, हालांकि, ' chmod a-w file' बेहतर होता है, और chmod -w file(बिना --) शिकायत करता है कि यह अलग व्यवहार करता है कि ' chmod a-w file' क्या करेगा।

संक्षेप में, पार्स किए गए विकल्प getoptएक के साथ उपसर्ग हैं -। जैसे ls -a, aएक विकल्प है। लंबे रूप ls --allहै allएक विकल्प के रूप। rm -rf(समतुल्य rm -r -f) में विकल्प rऔर fविकल्प दोनों हैं।

बाकी सब कुछ एक गैर-विकल्प तर्क है, जिसे तकनीकी रूप से ऑपरेंड कहा जाता है । मुझे इन स्थैतिक तर्कों को कॉल करना पसंद है , क्योंकि उनका अर्थ उनकी सापेक्ष स्थिति से निर्धारित होता है। में chmod, पहला स्थितीय तर्क मोड है और दूसरा स्थितीय तर्क फ़ाइल नाम है।

वैकल्पिक रूप से, मोड के साथ लीड नहीं होना चाहिए -। यदि ऐसा होता है, तो आपको --एक विकल्प के बजाय एक संचालन के रूप में पार्सिंग को मजबूर करने के लिए उपयोग करना चाहिए (यानी उपयोग करें chmod a-w fileया chmod -- -w fileइसके बजाय chmod -w file। यह भी POSIX द्वारा सुझाया गया है।


यदि आप स्रोत कोड को देखते हैं , तो आप देखेंगे कि यह कमांड-लाइन विकल्पों को पार्स करने के लिए गेटटॉप का उपयोग करता है । यहाँ, 'गलत' मोड के लिए विशेष हैंडलिंग है जैसे -w:

    case 'r':
    case 'w':
    case 'x':
    case 'X':
    case 's':
    case 't':
    case 'u':
    case 'g':
    case 'o':
    case 'a':
    case ',':
    case '+':
    case '=':
    case '0': case '1': case '2': case '3':
    case '4': case '5': case '6': case '7':
      /* Support nonportable uses like "chmod -w", but diagnose
         surprises due to umask confusion.  Even though "--", "--r",
         etc., are valid modes, there is no "case '-'" here since
         getopt_long reserves leading "--" for long options.  */

अपना उदाहरण लेते हुए:

  • chmod a-r file.txtहोगा सबसे मजबूत मंगलाचरण।
  • chmod +r file.txt काम करता है क्योंकि पहले तर्क को विधा के रूप में व्याख्या की जाती है।
  • chmod -r file.txtअभी भी काम करता है क्योंकि -rएक छोटे rविकल्प और विशेष-आवरण के रूप में व्याख्या की जाती है ।
  • chmod -- -r file.txtसही है और काम करता है क्योंकि -rमोड के रूप में स्थिति की व्याख्या की जाती है। बिना मामले से यह अलग है --क्योंकि के साथ एक के रूप में व्याख्या नहीं है विकल्प---r
  • chmod file.txt -rअभी भी काम करता है क्योंकि -rएक छोटे rविकल्प और विशेष-आवरण के रूप में व्याख्या की जाती है । विकल्प स्थिति-निर्भर नहीं हैं। यह तकनीकी रूप से एक अनिर्दिष्ट क्वर्क का दुरुपयोग करता है।
  • chmod file.txt +rकाम नहीं करता क्योंकि +rएक ऑपरेंड है, एक विकल्प नहीं है। पहले ऑपरेंड ( file.txt) को एक विधा के रूप में व्याख्यायित किया जाता है ... और पार्स करने में विफल रहता है।

4
यह दिलचस्प परिणाम हो सकता है यदि आपके पास एक फ़ाइल है, उदाहरण के लिए, a+rwxऔर कुछ ऐसा करें chmod * +r, और a+rwxफ़ाइल ग्लोब विस्तार में पहले आती है।
जोर्ग डब्ल्यू मित्तग

1
या "आरएम *" के मामले में "-rf" नामक फ़ाइल।
एडहिलिल

@Edheldil हां तुम सही हो। यह कुछ ऐसा लगता है जिसे संबोधित किया जाना चाहिए (और एक बग, जैसे कि अगर इनपुट ठीक से साफ नहीं किया गया था।
TestyTentacleLinux

ध्यान दें कि ओपी सिंटैक्स POSIX man7.org/linux/man-pages/man1/getopt.1.html#SCANNING_MODES
स्टीवन पेनी

@StevenPenny यह अप्रासंगिक है। सबसे पहले, लिंक किया गया मेनपेज सेक्शन 1 है, यानी getopt कमांड , सेक्शन 3 में लाइब्रेरी रूटीन नहीं । दूसरी बात, यह है कि , यानी स्वीकृत विकल्पों की सूची ( स्रोत में सेट है ) की बात हो रही है। लिंक किए गए "स्कैनिंग मोड" खंड का तर्क सरणी से कोई लेना-देना नहीं है जिसमें प्रोग्राम में पास किए गए आर्ग होते हैं। optstringchmodoptstring"Rcfvr::w::x::X::s::t::u::g::o::a::,::+::=::" argv
बॉब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.