एक बैश स्क्रिप्ट में जो मैंने बनाया है, मैं उपयोगकर्ता को कुछ जानकारी प्रिंट करने का प्रयास कर रहा हूं (एक विशेष त्रुटि के जवाब में) यह सुझाव देता है कि वे अपने आदेश में एक स्विच जोड़ते हैं। मैंने सोचा था कि $0 में हमेशा वह टेक्स्ट होता है जिसे उपयोगकर्ता ने टर्मिनल पर कमांड के रूप में टाइप किया था, इसलिए मेरा बैश इस तरह दिखता था: echo "try '$0 -s $@' instead."

मैंने पाया है कि जब मैं उस स्क्रिप्ट को एक सापेक्ष पथ से कॉल करता हूं, जैसे कि ./script.sh, $0 "./script.sh" जैसा मैं उम्मीद करता हूं। हालांकि, अगर script.sh मेरे पथ में है और मैं इसे script.sh के साथ कॉल करता हूं, $0 नहीं "script.sh" है। यह इसके बजाय स्क्रिप्ट फ़ाइल का पूर्ण पथ बन जाता है।

मैं दूसरे मामले को ठीक करने के लिए basename $0 का उपयोग कर सकता था, लेकिन यह पहले को गड़बड़ कर देगा। क्या यह पता लगाने का कोई तरीका है कि उपयोगकर्ता ने स्क्रिप्ट फ़ाइल शुरू करने वाले कमांड के लिए वास्तव में कौन सा टेक्स्ट टाइप किया है?

2
portalguy15837 10 मई 2018, 21:08

1 उत्तर

सबसे बढ़िया उत्तर

नहीं, आप आमतौर पर यह पता नहीं लगा सकते कि उपयोगकर्ता ने क्या टाइप किया है।

उपयोगकर्ता के पास हो सकता है:

  • इसके बजाय एक फ़ंक्शन या रैपर टाइप किया, जो आपके और अन्य कमांड को चलाता है, और जो पैरामीटर पर पास नहीं हो सकता है।
  • अत्यधिक गैर-बॉर्न शेल में कुछ टाइप किया, जैसे शेली का run_ "./script" ["--foo"]
  • कुछ लिखने के बजाय डेस्कटॉप मेनू पर क्लिक किया।
  • एंड्रॉइड टीवी पर चल रहे जावा स्निपेट में एक गैर-दोहराने योग्य स्ट्रीम से स्क्रिप्ट को निष्पादित किया गया।

कॉल करने वाले के लिए कैननिकल व्यवहार argv[0] को "एक फ़ाइल नाम स्ट्रिंग जो प्रक्रिया शुरू होने से जुड़ा है" (POSIX), जो कुछ भी इसका अर्थ लेता है, और आपके लिए sh-जैसे उपयोग विवरण में उन्हें वापस प्रतिध्वनित करना।

दुर्भाग्य से स्क्रिप्ट के लिए, कॉल करने वाले का argv[0] शेबैंग दुभाषिया के संकेत में खो जाता है, जो इसके बजाय $0 को उस फ़ाइलनाम तर्क पर सेट करना समाप्त कर देता है जिसकी वह व्याख्या कर रहा है।

हालांकि यह अभी भी ठीक है। आपके लिए महत्वपूर्ण बात यह है कि आप स्वयं को basename "$0" या "$0" से पहचानें और इंगित करें कि पैरामीटर गलत क्यों हैं। यह उपयोगकर्ता की जिम्मेदारी है कि वह परिवर्तनों को उनके विशेष कार्यप्रवाह में शामिल करे।

4
that other guy 11 मई 2018, 00:22