/। (डॉट स्लैश) एक कमांड है?


16

प्रश्न का मूल:

जब मैं सॉफ़्टवेयर स्थापित नहीं कर सका तो प्रश्न उत्पन्न हुआ, इसलिए मैं वास्तव में इसके बारे में पूछ रहा हूं। क्योंकि मैं इसके बारे में नहीं जानता था और आउटपुट "कमांड नहीं मिला" मुझे भ्रमित कर रहा था कि वास्तव में कमांड क्या था।

प्रसंग:

मैं फ़ाइल को स्थापित करना चाहूंगा truecrypt-7.2-setup-x86

निर्देश का उपयोग करने के लिए कहते हैं:

sudo ./truecrypt-7.2-setup-x86

लेकिन आउटपुट है:

sudo: ./truecrypt-7.2-setup-x86: command not found

अद्यतन: पूर्णता के लिए, परीक्षण में मैं फ़ाइल फ़ोल्डर में था, लेकिन अभी तक फ़ाइल को निष्पादन योग्य नहीं बनाया था (chmod / x)।


1
./आदेश का हिस्सा "मौजूदा निर्देशिका में देखो, और यहाँ से आदेश 'TrueCrypt-7.2-सेटअप-86' पर अमल" कह रहा है। आपको इस कमांड को उस डायरेक्टरी से चलाने की जरूरत है जहां आपने फाइल को अनपैक किया है।
चार्ल्स ग्रीन

2
@Videonauth - वास्तव में नहीं, व्यक्तिगत रूप से मुझे नहीं लगता कि यह एक उत्तर के स्तर तक बढ़ जाता है।
चार्ल्स ग्रीन

1
@Zanna मैंने बिना अनुमतियों को निष्पादित किए एक स्क्रिप्ट का परीक्षण किया, और फेंकी गई त्रुटि एक लापता अनुमति त्रुटि थी, एक कमांड नहीं मिला।
चार्ल्स ग्रीन

2
@ubuntubu ठीक है, बहुत अच्छी तरह से, आप निर्देशिका में चले गए हैं - अच्छा। हालांकि, संपादन पर छोटी टिप्पणी। कमांड होना चाहिए chmod +x, chmod -xइसके विपरीत है - यह निष्पादन योग्य अनुमतियों को हटा देता है
सर्जियो कोलोडियाज़नी

4
प्रश्न शीर्षक शरीर से काफी अलग है; शायद यह तय किया जाना चाहिए?
डेविड ज़ेड

जवाबों:


24

./एक कमांड नहीं है। आज्ञा है ./truecrypt-7.2-setup-x86

आपके शेल और प्रोग्राम जैसे sudoकमांड कमांड को पथनाम के रूप में मानेंगे जब इसमें कम से कम एक /वर्ण होगा। चूंकि .आप वर्तमान में जो भी निर्देशिका का प्रतिनिधित्व करते हैं, ./truecrypt-7.2-setup-x86वह फ़ाइल truecrypt-7.2-setup-x86को वर्तमान निर्देशिका में नाम देता है । यदि ऐसी कोई फ़ाइल नहीं है, या वहाँ है, लेकिन फ़ाइल नहीं चलाई जा सकती है, तो आपको एक त्रुटि संदेश मिलेगा।

जब एक कमांड में स्लैश नहीं होता है, तो सूचीबद्ध निर्देशिकाओं $PATHको इसके लिए खोजा जाता है, जैसा कि सर्जी कोलोडियाज़नी कहते हैं । वर्तमान निर्देशिका को स्वचालित रूप से खोजा नहीं गया है - और इसे डालने की अनुशंसा नहीं की .गई है $PATH। इस तरह, आप गलती से उन चीजों को नहीं चलाते हैं, जिन्हें आप चलाने की उम्मीद नहीं करते थे क्योंकि आप cdएक निर्देशिका में घ के लिए हुए थे जो उन्हें शामिल करता है।

./वर्तमान निर्देशिका में एक निष्पादन योग्य का नाम लिखने से पहले इसे चलाने का सामान्य तरीका है, लेकिन यह वास्तव में एक विशेष वाक्यविन्यास नहीं है। उदाहरण के लिए, यदि आपने अपना मैसेज किया है $PATHऔर आपको कमांड चलाने की जरूरत है ls, तो आप लिख सकते हैं /bin/ls.उस मामले में या सामान्य रूप से आवश्यक नहीं है; /पथनामे में कहीं न कहीं यह ज़रूरी है कि आप यह संकेत दें कि यह एक मार्गनाम है।

चूँकि .हमेशा वर्तमान निर्देशिका होती है और /बस निर्देशिका विभाजक होती है, पहली बात यह जाँचना है कि आपने जिस फ़ाइल का नाम रखा है वह वर्तमान निर्देशिका में मौजूद है। (यदि ऐसा होता है, तो इसकी अनुमतियों की जांच करें , जैसा कि चार्ल्स ग्रीन बताते हैं । लेकिन अगर आपने फ़ाइल को एक संग्रह से निकाला है, तो यह आम तौर पर पहले से ही निष्पादन योग्य अनुमति होगी यदि इसे चलाने का इरादा है।)


21

कमांड का / हिस्सा कह रहा है "वर्तमान निर्देशिका में देखें, और यहां से 'truecrypt-7.2-setup-x86' कमांड निष्पादित करें"। आपको इस कमांड को उस निर्देशिका से चलाने की आवश्यकता है जहां आपने फ़ाइल को अनपैक किया है।

यह परीक्षण किया जा सकता है: उसी टर्मिनल विंडो में जहां आप कमांड का प्रयास कर रहे हैं, कमांड दर्ज करें ls -l true*- यदि फ़ाइल वर्तमान कार्य निर्देशिका में मौजूद है, तो फ़ाइल को दिखाने वाली एक सूची (और अतिरिक्त जानकारी का एक गुच्छा) प्रदर्शित की जाएगी।

जैसा कि ज़न्ना ने टिप्पणियों में उल्लेख किया है, आपकी फ़ाइल में अनुमतियाँ निष्पादित नहीं हो सकती हैं - यह आसानी से तय किया जा सकता है। एक परीक्षण के मामले के रूप में, मेरी निर्देशिका दिखाती है

chick@dad:~/test$ ls -l
total 4
-rw-r--r-- 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$

और फ़ाइल "rFullBack" फ़ाइल को पढ़ने और लिखने के लिए मेरी अनुमति के रूप में '-rw-' को सूचीबद्ध करता है। मैं कमांड chmod +x rFullBackऔर डायरेक्टरी लिस्टिंग में बदलाव कर सकता हूं

chick@dad:~/test$ ls -l
total 4
-rwxr-xr-x 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$

वहां मेरी अनुमति अब '-rwx' है, यह दर्शाता है कि मैं फ़ाइल निष्पादित कर सकता हूं।


संक्षेप में, यदि फ़ाइल आपकी निर्देशिका में मौजूद है

कमांड चलाएं

chmod +x ./truecrypt-7.2-setup-x86

और फिर कमांड

sudo ./truecrypt-7.2-setup-x86

1
काफी नहीं। यह rw-आपकी अनुमति के रूप में सूचीबद्ध करता है - -इससे पहले कि यह सेट के लिए है [gu] आईडी और चिपचिपा बिट्स।
डंकन एक्स सिम्पसन

@DuncanXSimpson धन्यवाद - मैंने अनुमतियों के विवरण को थोड़ा अपडेट किया है, लेकिन मैं इस उत्तर के लिए सेटगिड और चिपचिपा बिट्स को अनदेखा करने जा रहा हूं!
चार्ल्स ग्रीन

8

शेल काम में कॉलिंग कमांड कैसे करता है

नहीं, यह एक आदेश नहीं है। जिस तरह से गोले काम करते हैं, जब आप पाठ की एक पंक्ति में टाइप करते हैं, तो पहले शब्द को कमांड के रूप में माना जा रहा है, और यदि कमांड शेल में निर्मित शेल में से एक नहीं है, तो शेल PATH पर्यावरण चर में सूचीबद्ध सभी स्थानों पर दिखेगा ।

जब आप जिस कमांड को चलाना चाहते हैं वह उसी निर्देशिका में होता है जैसा कि आप वर्तमान में स्थित हैं, लेकिन वह निर्देशिका निर्देशिका की सूची में नहीं है PATH? जब आपको उपयोग करने की आवश्यकता हो ./। यह एक तरह से ऐसा ही है जैसे /bin/bashआप कर रहे हैं - आप शेल को बता रहे हैं कि आपका वांछित कमांड कहाँ स्थित है, इसके लिए एक पूर्ण पथ। और के मामले में /। आप "इस निर्देशिका में देखो" शेल करने के लिए कह रहे हैं। इतना महत्वपूर्ण हिस्सा यह है कि आपको उसी निर्देशिका में रहना होगा जहां फ़ाइल स्थित है।

बेशक, वास्तव में एक निष्पादन योग्य चलाने के लिए, इसमें निष्पादन योग्य बिट सेट होना चाहिए, इसलिए आपको इसकी आवश्यकता होगी chmod +x ./my_file

तो महत्वपूर्ण कदम:

  1. cd आपने फ़ाइल को कहाँ सहेजा है; अगर यह अंदर है ~/Downloads, तोcd ~/Downloads
  2. भागो chmod +x ./truecrypt-7.2-setup-x86, यह कहता है "फ़ाइल बनाना truecrypt-7.2-setup-x86 जो इस निर्देशिका में निष्पादन योग्य है"
  3. और अब करते हैं 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स्पष्ट रूप से भ्रामक है, इसलिए इसे ध्यान में रखा जाना चाहिए; हालाँकि कृपया ध्यान दें कि यह उस प्रश्न का मूल नहीं था जो ओपी पूछ रहा है।

प्रलेखन और संदर्भ

से bash4.3 मैनुअल, "COMMAND कार्यान्वयन" अनुभाग:

यदि नाम न तो शेल फ़ंक्शन है और न ही एक बिलिन है, और इसमें कोई स्लैश नहीं है, तो बैश उस नाम से एक निष्पादन योग्य फ़ाइल वाली निर्देशिका के लिए पथ के प्रत्येक तत्व को खोजता है।

से बैश में इसे चलाने के लिए क्यों आप की जरूरत स्क्रिप्ट नाम से पहले (डॉट स्लैश) कर ./? :

यह / ./ के साथ काम करता है क्योंकि POSIX निर्दिष्ट करता है कि एक कमांड नाम जिसमें a / का उपयोग सीधे फ़ाइल नाम के रूप में किया जाएगा, $ PATH में खोज को दबाएगा। आप एक ही प्रभाव के लिए पूर्ण पथ का उपयोग कर सकते थे, लेकिन ./ छोटा और लिखने में आसान है।


वास्तव में sudoआउटपुट भ्रामक है। आप एक ही बिना प्रयास करते हैं तो sudo, आप से एक और त्रुटि मिलेगी bash: Permission denied। और ठीक ही तो, क्योंकि आपने स्क्रिप्ट को निष्पादित करने की अनुमति नहीं दी है (के माध्यम से chmod +x)।
रुस्लान

@Ruslan तथ्य यह है कि sudoउत्पादन भ्रामक है सच है, लेकिन यह त्रुटि है कि दिखाता है। यह डेवलपर्स के लिए रिपोर्ट करने और उन्हें इसे ठीक करने के लिए कुछ हो सकता है। हालांकि यह चर्चा का मूल नहीं है - हमें यह स्थापित करने की आवश्यकता है कि ओपी ने इस तरह की त्रुटि पैदा करने के लिए क्या किया है, और उन्हें सही मार्ग के लिए मार्गदर्शन करें। यह भ्रामक है या नहीं - यह यहाँ मुद्दा नहीं है।
सेर्गेई कोलोडियाज़नी

दूसरे तरीके से, यह उपयोग करने के समान नहीं है/bin/bash : यह आपको उस स्क्रिप्ट को निष्पादित करने की अनुमति नहीं देता है जिस पर आपके पास अनुमति निष्पादित नहीं है। जब आप स्क्रिप्ट नाम के साथ प्रस्तावना देते हैं /bin/bash, तो जो तथ्य /bin/bashनिष्पादन योग्य होता है, वह सब मायने रखता है, क्योंकि यह कमांड निष्पादित हो रहा है। जब आप ऐसा नहीं करते हैं, तो स्क्रिप्ट को ही निष्पादित किया जा रहा है, जो बदले में आपके वर्तमान शेल या जो भी शीर्ष #!रेखा पर लाया जा रहा है
मोंटी हार्डर

@ मेन्टीहार्डर /bin/bashयहाँ एक उदाहरण मात्र है। तथ्य यह है कि हम बुला रहे हैं /bin/bashऔर निष्पादित होने वाली चीज़ को पथ./script.sh निर्दिष्ट करके - वही है। स्क्रिप्ट को पहले से अलग करना या पूरी तरह से अलग विषय है, जहां आप एक निष्पादन योग्य और पास स्क्रिप्ट को तर्क के रूप में चलाते हैं - जो कि सिंटैक्स को आपके द्वारा कॉल किए जा रहे शेल के अलावा किसी अन्य चीज़ के लिए लिखे जाने पर टूट सकता है । निष्पादन योग्य ठीक है, लेकिन तथ्य यह है कि आप अभी भी इसे पूर्ण पथ निर्दिष्ट कर रहे हैं। bash script.sh/bin/bash script.shcsh/bin/bash
सेर्गेई कोलोडियाज़नी

2
@SergiyKolodyazhnyy के साथ एक स्क्रिप्ट नाम prefacing /bin/bashया बस bashहै भी स्क्रिप्ट पर निष्पादन योग्य अनुमतियों की कमी को हल करने के एक आम तरीका है। पूर्ण स्क्रिप्ट पथ निर्दिष्ट करने से वह समस्या हल नहीं होती है। तो /bin/bashइस विशिष्ट मामले में एक विशेष रूप से बुरा उदाहरण है।
मोंटी हार्डर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.