शेल काम में कॉलिंग कमांड कैसे करता है
नहीं, यह एक आदेश नहीं है। जिस तरह से गोले काम करते हैं, जब आप पाठ की एक पंक्ति में टाइप करते हैं, तो पहले शब्द को कमांड के रूप में माना जा रहा है, और यदि कमांड शेल में निर्मित शेल में से एक नहीं है, तो शेल PATH
पर्यावरण चर में सूचीबद्ध सभी स्थानों पर दिखेगा ।
जब आप जिस कमांड को चलाना चाहते हैं वह उसी निर्देशिका में होता है जैसा कि आप वर्तमान में स्थित हैं, लेकिन वह निर्देशिका निर्देशिका की सूची में नहीं है PATH
? जब आपको उपयोग करने की आवश्यकता हो ./
। यह एक तरह से ऐसा ही है जैसे /bin/bash
आप कर रहे हैं - आप शेल को बता रहे हैं कि आपका वांछित कमांड कहाँ स्थित है, इसके लिए एक पूर्ण पथ। और के मामले में /। आप "इस निर्देशिका में देखो" शेल करने के लिए कह रहे हैं। इतना महत्वपूर्ण हिस्सा यह है कि आपको उसी निर्देशिका में रहना होगा जहां फ़ाइल स्थित है।
बेशक, वास्तव में एक निष्पादन योग्य चलाने के लिए, इसमें निष्पादन योग्य बिट सेट होना चाहिए, इसलिए आपको इसकी आवश्यकता होगी chmod +x ./my_file
।
तो महत्वपूर्ण कदम:
cd
आपने फ़ाइल को कहाँ सहेजा है; अगर यह अंदर है ~/Downloads
, तोcd ~/Downloads
- भागो
chmod +x ./truecrypt-7.2-setup-x86
, यह कहता है "फ़ाइल बनाना truecrypt-7.2-setup-x86 जो इस निर्देशिका में निष्पादन योग्य है"
- और अब करते हैं
sudo ./truecrypt-7.2-setup-x86
ध्यान दें कि इसका उपयोग ./
यादृच्छिक व्यवहार नहीं है, लेकिन वास्तव में एक मानक है, जो पोर्टेबल ऑपरेटिंग सिस्टम इंटरफ़ेस मानक (उर्फ पोसिक्स) द्वारा निर्दिष्ट है , विशेष रूप से "कमांड सर्च एंड एक्ज़ेक्यूशन" अनुभाग देखें।
त्रुटि को पुन: प्रस्तुत करना
$ # my script is in ~/Downloads folder
$ stat -c "%n" /home/xieerqi/Downloads/my_script.sh
/home/xieerqi/Downloads/my_script.sh
$ # if I run sudo ./my_script.sh, we get an error
$ sudo ./my_script.sh
[sudo] password for xieerqi:
sudo: ./my_script.sh: command not found
$ # of course the command not found because file is not in ./, not in this dir
$ # this is not sudo's problem
$ # but sudo does indeed show the same error even if you're in same directory
$ cd ./Downloads/
$ sudo ./my_script.sh
[sudo] password for xieerqi:
sudo: ./my_script.sh: command not found
नोट : द्वारा दिया गया त्रुटि संदेश sudo
स्पष्ट रूप से भ्रामक है, इसलिए इसे ध्यान में रखा जाना चाहिए; हालाँकि कृपया ध्यान दें कि यह उस प्रश्न का मूल नहीं था जो ओपी पूछ रहा है।
प्रलेखन और संदर्भ
से bash
4.3 मैनुअल, "COMMAND कार्यान्वयन" अनुभाग:
यदि नाम न तो शेल फ़ंक्शन है और न ही एक बिलिन है, और इसमें कोई स्लैश नहीं है, तो बैश उस नाम से एक निष्पादन योग्य फ़ाइल वाली निर्देशिका के लिए पथ के प्रत्येक तत्व को खोजता है।
से बैश में इसे चलाने के लिए क्यों आप की जरूरत स्क्रिप्ट नाम से पहले (डॉट स्लैश) कर ./? :
यह / ./ के साथ काम करता है क्योंकि POSIX निर्दिष्ट करता है कि एक कमांड नाम जिसमें a / का उपयोग सीधे फ़ाइल नाम के रूप में किया जाएगा, $ PATH में खोज को दबाएगा। आप एक ही प्रभाव के लिए पूर्ण पथ का उपयोग कर सकते थे, लेकिन ./ छोटा और लिखने में आसान है।
./
आदेश का हिस्सा "मौजूदा निर्देशिका में देखो, और यहाँ से आदेश 'TrueCrypt-7.2-सेटअप-86' पर अमल" कह रहा है। आपको इस कमांड को उस डायरेक्टरी से चलाने की जरूरत है जहां आपने फाइल को अनपैक किया है।