मैंने गलत क्रम में कमांड चामोद को कॉल करने की कोशिश की है। chmod file.txt -r
यह किसी कारण के लिए काम किया। chmod file.txt +r
दूसरी ओर काम करने से मना कर दिया। ऐसा क्यों है? किस कारण से एक कमांड काम करता है, और दूसरा नहीं?
मैंने गलत क्रम में कमांड चामोद को कॉल करने की कोशिश की है। chmod file.txt -r
यह किसी कारण के लिए काम किया। chmod file.txt +r
दूसरी ओर काम करने से मना कर दिया। ऐसा क्यों है? किस कारण से एक कमांड काम करता है, और दूसरा नहीं?
जवाबों:
यह एक 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
) को एक विधा के रूप में व्याख्यायित किया जाता है ... और पार्स करने में विफल रहता है।getopt
कमांड , सेक्शन 3 में लाइब्रेरी रूटीन नहीं । दूसरी बात, यह है कि , यानी स्वीकृत विकल्पों की सूची ( स्रोत में सेट है ) की बात हो रही है। लिंक किए गए "स्कैनिंग मोड" खंड का तर्क सरणी से कोई लेना-देना नहीं है जिसमें प्रोग्राम में पास किए गए आर्ग होते हैं। optstring
chmod
optstring
"Rcfvr::w::x::X::s::t::u::g::o::a::,::+::=::"
argv
a+rwx
और कुछ ऐसा करेंchmod * +r
, औरa+rwx
फ़ाइल ग्लोब विस्तार में पहले आती है।