अगर मैं टाइप करता हूँ
::
एक बैश शेल में, मुझे मिलता है:
-bash: ::: command not found
लेकिन, :
आउटपुट में केवल एक ही परिणाम है। ऐसा क्यों है?
अगर मैं टाइप करता हूँ
::
एक बैश शेल में, मुझे मिलता है:
-bash: ::: command not found
लेकिन, :
आउटपुट में केवल एक ही परिणाम है। ऐसा क्यों है?
जवाबों:
:
खोल में निर्मित बनाम न के बराबर::
:
खोल में निर्मित आदेश मौजूद है (ध्यान दें बाहरी और बिल्ट-इन आदेशों के बीच अंतर ) जो कुछ नहीं करता है; यह सिर्फ 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
command.com
और विंडोज की cmd.exe
एक समान लेकिन विपरीत स्थिति होती है: :
स्पष्ट रूप से एक गोटो लेबल (एक कमांड नहीं) और अक्सर एक टिप्पणी चरित्र (जैसे :: This is a comment
) के रूप में पुनर्निर्मित किया जाता है ।
अंतिम कॉलोन डिफ़ॉल्ट "पाया नहीं" संदेश का हिस्सा है:
$ 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
उदाहरण के लिए देखें कि कोलन बिलियन किस उद्देश्य से कार्य करता है?
$ ::
bash: ::: command not found
$ kkkk
bash: kkkk: command not found
3 स्वरूपण से एक स्पेसर है
bash a :
में एक खाली लाइन void निर्देश है