कमांड के रूप में दो कॉलनों के लिए त्रुटि संदेश क्यों होता है: (:) in bash में तीन कॉलन होते हैं, लेकिन एक एकल कॉलन कोई आउटपुट नहीं देता है?


27

अगर मैं टाइप करता हूँ

::

एक बैश शेल में, मुझे मिलता है:

-bash: ::: command not found

लेकिन, :आउटपुट में केवल एक ही परिणाम है। ऐसा क्यों है?


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
थॉमस वार्ड Thomas

यह उबंटू से कैसे संबंधित है?
NerdOfCode

@NerdOfCode यह उसी तरह है? meta.askubuntu.com/q/17076/158442
muru

जवाबों:


40

:खोल में निर्मित बनाम न के बराबर::

: खोल में निर्मित आदेश मौजूद है (ध्यान दें बाहरी और बिल्ट-इन आदेशों के बीच अंतर ) जो कुछ नहीं करता है; यह सिर्फ trueकमांड की तरह ही सफलता देता है । :में निर्मित मानक और है POSIX मानक द्वारा परिभाषित किया गया है, जहां यह भी "शून्य उपयोगिता" के रूप में जाना जाता है। इसका उपयोग अक्सर परीक्षण के लिए या अनंत लूप चलाने के लिए किया जाता हैwhile : ; do ...;done

bash-4.3$ type :
: is a shell builtin

हालांकि, ::- दो बृहदान्त्र वर्ण एक साथ - शेल के लिए एक "शब्द" के रूप में व्याख्या किए जाते हैं, और यह उपयोगकर्ता द्वारा दर्ज किए गए कमांड होने का अनुमान लगाता है। शेल निर्मित-इन्स की जाँच की प्रक्रिया से गुजरेगा, फिर PATHउस कमांड के अस्तित्व के लिए चर में कोई निर्देशिका । लेकिन इसमें न तो कोई अंतर्निहित :: और न ही बाहरी कमांड है ::। इसलिए, यह एक त्रुटि पैदा करता है।

खैर, एक त्रुटि के लिए एक विशिष्ट प्रारूप क्या है?

<shell>: <command user typed>: error message

इस प्रकार, आप जो देख रहे हैं वह 3 कॉलन नहीं है, लेकिन जो आपने टाइप किया है वह मानक त्रुटि प्रारूप में पेस्ट किया गया है।

ध्यान दें, कि :कमांड-लाइन तर्क ले सकते हैं, अर्थात ऐसा करना कानूनी है:

: :

इस मामले में, शेल यह विचार करेगा कि दो "शब्द" के रूप में, जिनमें से एक एक कमांड है और दूसरा एक स्थितीय पैरामीटर है। यह भी कोई त्रुटि नहीं पैदा करेगा! ( :स्थितिगत मापदंडों के साथ उपयोग के बारे में ऐतिहासिक नोट (बाद में इस उत्तर में) को भी देखें ।)


बैश के अलावा अन्य गोले में

ध्यान दें कि स्वरूपण अलग-अलग गोले के बीच भी हो सकता है। के लिए bash, kshऔर mkshव्यवहार सुसंगत है। उदाहरण के लिए, उबंटू का डिफ़ॉल्ट /bin/shशेल (जो वास्तव में है /bin/dash):

$ dash
$ ::
dash: 1: ::: not found

जहां 1 कमांड नंबर है (स्क्रिप्ट में लाइन नंबर के बराबर)।

csh इसके विपरीत कोई त्रुटि संदेश नहीं देता है:

$ csh
% ::
%

वास्तव में, यदि आप चलाते हैं strace -o csh.trace csh -c ::, तो csh.traceफ़ाइल में ट्रेस आउटपुट से पता चलता है कि cshनिकास स्थिति 0 (कोई त्रुटि नहीं) के साथ बाहर निकलता है। लेकिन tcshक्या त्रुटि का उत्पादन करता है (बिना उसका नाम बताए, हालांकि):

$ tcsh
localhost:~> ::
::: Command not found.

त्रुटि संदेश

सामान्य तौर पर, त्रुटि संदेश में पहला आइटम निष्पादन प्रक्रिया या कार्य होना चाहिए (आपका शेल निष्पादित करने का प्रयास करता है ::, इसलिए त्रुटि संदेश शेल से आता है)। उदाहरण के लिए, निष्पादन प्रक्रिया यहां है stat:

$ stat noexist
stat: cannot stat 'noexist': No such file or directory

वास्तव में, POSIX पेरोर () फ़ंक्शन को परिभाषित करता है , जो प्रलेखन के अनुसार एक स्ट्रिंग तर्क लेता है, फिर कॉलन के बाद त्रुटि संदेश को आउटपुट करता है, और फिर न्यूलाइन। उद्धरण:

पेरोर () फ़ंक्शन भाषा-निर्भर त्रुटि संदेश के प्रतीक चिह्न के माध्यम से एक्सेस की गई त्रुटि संख्या को मैप करेगा, जो निम्नानुसार मानक त्रुटि स्ट्रीम में लिखा जाएगा:

  • पहला (यदि s एक अशक्त सूचक नहीं है और s द्वारा इंगित वर्ण null बाइट नहीं है), स्ट्रिंग एक उपनिवेश और एक <space> द्वारा पीछा करती है।

  • फिर एक त्रुटि संदेश स्ट्रिंग एक <newline> द्वारा पीछा किया।

और perror()तकनीकी रूप से स्ट्रिंग तर्क कुछ भी हो सकता है, लेकिन निश्चित रूप से स्पष्टता के लिए यह आमतौर पर फ़ंक्शन का नाम है या argv[0]

इसके विपरीत, GNU के पास त्रुटि से निपटने के लिए फ़ंक्शंस और वैरिएबल्स का अपना सेट है , जिसे एक प्रोग्रामर स्ट्रीम fprintf()करने के लिए उपयोग कर सकता stderrहै। लिंक्ड पेज शो में एक उदाहरण के रूप में, कुछ इस तरह से किया जा सकता है:

  fprintf (stderr, "%s: Couldn't open file %s; %s\n",
           program_invocation_short_name, name, strerror (errno));

ऐतिहासिक नोट

पुराने यूनिक्स और थॉम्पसन शेल में, स्टेटमेंट के: साथ उपयोग किया गया था (जो इस थ्रेड पर पेरडैबो नाम के उपयोगकर्ता के अनुसार शेल निर्मित नहीं था)। मैनुअल से उद्धरण:goto

संपूर्ण कमांड फ़ाइल को एक लाइन के साथ शुरू होने के लिए खोजा जाता है: पहले गैर-रिक्त चरित्र के रूप में, उसके बाद एक या अधिक रिक्तियाँ, और फिर लेबल। यदि इस तरह की एक रेखा पाई जाती है, तो गोटो रिपॉजिशन, लेबल के बाद लाइन में कमांड-फाइल की भरपाई करता है और बाहर निकलता है। इसके कारण शेल लेबल लाइन में स्थानांतरित हो जाता है।

तो आप एक अनंत लूप स्क्रिप्ट बनाने के लिए कुछ ऐसा कर सकते हैं:

: repeat
echo "Hello World"
goto repeat

"3 कॉलम" टाइपो के लिए "3 कॉलन"
बरमार

1
डॉस command.comऔर विंडोज की cmd.exeएक समान लेकिन विपरीत स्थिति होती है: :स्पष्ट रूप से एक गोटो लेबल (एक कमांड नहीं) और अक्सर एक टिप्पणी चरित्र (जैसे :: This is a comment) के रूप में पुनर्निर्मित किया जाता है ।
ग्रैविटी

54

अंतिम कॉलोन डिफ़ॉल्ट "पाया नहीं" संदेश का हिस्सा है:

$ x
x: command not found
$ ::
::: command not found

कारण एक ही पेट के लिए कुछ भी नहीं पैदा करता है वह यह है कि : है एक वैध आदेश - हालांकि यह (वापसी को छोड़कर कुछ नहीं करता है TRUE)। के SHELL BUILTIN COMMANDSअनुभाग से man bash:

   : [arguments]
          No effect; the command does nothing beyond  expanding  arguments
          and  performing any specified redirections.  A zero exit code is
          returned.

आप इसे कभी-कभी निर्माणों की तरह देखेंगे

while :
do
  something
done

उदाहरण के लिए देखें कि कोलन बिलियन किस उद्देश्य से कार्य करता है?


हाँ, यह सबसे व्यापक टिप्पणी है .. मेरी तुलना में बहुत अधिक .. बहुत बेहतर समझाया: डी
जॉन ओरियन

8

किसी अन्य गैर-मौजूद आदेश का प्रयास करें और आप देखेंगे कि :अंग्रेजी में इसका सामान्य उद्देश्य है:

$ ---
---: command not found

6

जोड़ा गया कॉलन स्वयं त्रुटि संदेश का हिस्सा है। यदि एक प्रकार cd owयह परिणाम है bash: cd: ow: No such file or directory, जो दिखाता है कि त्रुटि अतिरिक्त बृहदान्त्र में डाल रहा है: No such file or directory


6
$ ::
bash: ::: command not found
$ kkkk
bash: kkkk: command not found

3 स्वरूपण से एक स्पेसर है

bash a :में एक खाली लाइन void निर्देश है


4

आपको 3 कॉलोन मिलते हैं क्योंकि त्रुटि प्रारूप में एक कोलन होता है:

bash: <command>: command not found
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.