"कमांड नहीं मिली" और "ऐसी कोई फ़ाइल या निर्देशिका नहीं" के बीच अंतर?


33

उदाहरण के लिए:

$ node
-bash: /usr/local/bin/node: No such file or directory
$ foo
-bash: foo: command not found

क्या फर्क पड़ता है? दोनों ही मामलों में, nodeऔर fooअमान्य आदेश हैं, लेकिन ऐसा लगता है कि यूनिक्स सिर्फ nodeबाइनरी नहीं ढूंढ सकता है ? किसी प्रोग्राम को अनइंस्टॉल करते समय, उदाहरण के लिए node, इसे साफ करने का एक तरीका है ताकि मुझे मिल सके

$ node
-bash: node: command not found

संपादित करें:

typeआदेश से परिणाम :

$ type node
node is hashed (/usr/local/bin/node)
$ type foo
-bash: type: foo: not found

क्या आप अपने प्रश्न को दोनों के आउटपुट के साथ अपडेट कर सकते हैं ( type nodeऔर type fooशायद केवल पहला वास्तव में मददगार है)।
एरिक रेनॉफ

@EricRenouf, ठीक है, मैंने किया।
gwg

2
शायद यह है कि 'नोड' / usr / bin / node -> / usr / स्थानीय / बिन / नोड से एक प्रतीकात्मक लिंक है और बाद में उपलब्ध नहीं है, इसलिए त्रुटि, जो सुझाव देगी / usr / स्थानीय / बिन / नोड को हटा दिया गया था प्रतीकात्मक लिंक बनाया गया था।
इसी तरह 17:13 बजे

जवाबों:


59

ऐसा इसलिए क्योंकि bashआपकी कमांड की जगह याद है, उसे हैश टेबल में स्टोर करें ।

आपके द्वारा अनइंस्टॉल किए जाने के बाद node, हैश टेबल साफ़ नहीं की जाती है, फिर bashभी सोचता nodeहै /usr/local/bin/nodeकि PATHलुक को छोड़ दिया जाए , और /usr/local/bin/nodeसीधे कॉल करके, का उपयोग करके execve()। चूंकि nodeअब नहीं है, इसलिए त्रुटि execve()लौटाता ENOENTहै, जिसका अर्थ ऐसी कोई फ़ाइल या निर्देशिका नहीं है, bashजिसने आपको वह त्रुटि बताई है।

में bash, आप हैश तालिका से एक प्रविष्टि निकाल सकते हैं:

hash -d node

या संपूर्ण हैश तालिका को हटा दें ( सभी POSIX शेल में काम करता है ):

hash -r

2
ध्यान दें कि यह /usr/local/bin/nodeगायब होना जरूरी नहीं है ; यदि वह फ़ाइल एक गतिशील रूप से लिंक की गई निष्पादन योग्य है, और निर्भरता में से एक गायब है, तो आपको वही "ऐसी कोई फ़ाइल या निर्देशिका" संदेश नहीं मिलेगा। यह आपको पागल बना सकता है जब तक आप lddउस फाइल पर प्रयास नहीं करते ।
गुंतराम ब्लोह

@GuntramBlohm लेकिन कुछ लिनक्स डिस्ट्रोस बैश पर अधिक समझने योग्य त्रुटि संदेश प्रिंट करने के लिए पैच किया गया है, जैसे progname: error while loading shared libraries: badLib.so.1: cannot open shared object file: No such file or directory(या यह इस विशेष मामले में नहीं हो सकता है, लेकिन ld-linux.so)।
रुस्लान

@Ruslan मेरे अनुभव में आपको "साझा लाइब्रेरी को लोड करते समय त्रुटि" मिलती है, अगर यह "साधारण" साझा लाइब्रेरी है जो गायब है, और यदि यह डायनेमिक लिंकर है तो यह "नहीं ऐसी फ़ाइल या निर्देशिका" अनुपलब्ध है। यह तब समझ में आता है जब आपको पता चलता है कि पूर्व मामले को डायनेमिक लिंकर द्वारा पता लगाया गया है, जबकि बाद वाले केस का पता कर्नेल द्वारा लगाया गया है, और डायनेमिक लिंकर के लिए एक उपयोगी संदेश ( execveस्टडर को विफलता पर साइड इफेक्ट के रूप में लिखना) को प्रिंट करना बहुत आसान है संभवतः POSIX या कुछ का उल्लंघन करेगा)
zwol

@zwol आह, ठीक है, कि कुछ distros (जैसे CentOS) पैच बैश है। इस तरह के पैच किए गए संस्करण फिर त्रुटियों को प्रिंट करते हैं /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
रुस्लान

-6

मैंने Ubuntu Linux 16.04 पर पाया कि "ऐसी कोई फ़ाइल या निर्देशिका नहीं" का अर्थ है कि आपको अपनी वर्तमान कार्यशील निर्देशिका को स्विच करना होगा, जबकि "कमांड नहीं मिली" का अर्थ है कि आपको समस्या को ठीक करने के लिए apt-get install xxxyyy_zzz का उपयोग करना होगा।


10
यदि आपके cwd पर कोई प्रभाव पड़ेगा जो पाया जाएगा या नहीं (जब तक कि आप इसे / ./ के साथ उपसर्ग नहीं करते हैं), तो आपका PATH एक असुरक्षित तरीके से सेट होता है। और जो कमांड नहीं मिल रहा है वह हमेशा एक समस्या नहीं है जिसे आप ठीक करना चाहते हैं :)
रैकैंडबोनमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.