विंडोज कमांड लाइन में "cd .." क्यों काम करता है?


86

जब cd..बीच cdऔर ..Windows कमांड प्रॉम्प्ट के बिना टाइपिंग ख़ुशी से मूल फ़ोल्डर में बदल जाएगी। क्या इस व्यवहार के लिए कोई स्पष्टीकरण है? आदेश के मानक प्रारूप का पालन नहीं करता हैcommand<space>arguments

काम कर रहे हैं, लेकिन नहीं करना चाहिए?

इसके अलावा, यह लगातार परिणाम क्यों नहीं बनाता है?

गूंज ..


24
आपके प्रश्न का आधार खंडित प्रतीत होता है। क्या आप अपने दावे के लिए कोई सबूत दे सकते हैं कि यह वाक्य-रचना गलत है?
ऑर्बिट

13
मुझे नहीं लगता कि "कमांड <स्पेस> दलीलें" कभी भी cmd (या इसके किसी भी पूर्ववर्ती) में मानक प्रारूप रही हैं; उदाहरण के लिए dir/aया इसी तरह के वीएमएस सिंटैक्स पर विचार करें।
विशाल

6
सीडी बहुत खास है। आप cd c:\program filesउद्धरण के बिना टाइप कर सकते हैं और यह अभी भी काम करता है
phuclv

20
यहाँ एक बहुत ही मनोरंजक लेख है, जो विंडोज शेल लॉजिक के
प्रश्नों के

3
cd..काम क्यों करता है ? क्योंकि Microsoft स्पष्ट रूप से इसे काम करने की परेशानी से गुज़रा। cdविंडोज कमांड कमांड दुभाषिया में बनाया गया एक कमांड है, और माइक्रोसॉफ्ट अपने दुभाषिया को जो चाहे कर सकता है। (एक अन्य उदाहरण के रूप cdमें, नाम में रिक्त स्थान के साथ निर्देशिकाओं को उद्धृत करने की भी आवश्यकता नहीं है।)
jamesdlin

जवाबों:


106

जैसा कि कुछ अन्य उत्तर / टिप्पणियाँ ध्यान दें, यह विचार कि कमांड सही नहीं है के बाद एक स्थान होना चाहिए। एक प्रसिद्ध उदाहरण यह है कि आप एक कमांड के बाद आगे स्लैश टाइप कर सकते हैं, पहले एक स्थान की आवश्यकता के बिना।

हालांकि, एक और व्यवहार है जो थोड़ा कम समझा जाता है, और उस " cd.." को अनुमति देता है जिसके बारे में आप पूछ रहे हैं। यह व्यवहार cd\काम करने के लिए भी अनुमति देता है ।

आपके द्वारा वर्णित व्यवहार कमांड लाइन दुभाषिया के लिए आंतरिक सभी आदेशों के अनुरूप है। यदि आपके पास अवधि, फ़ॉरवर्ड स्लैश या बैकस्लैश सहित कुछ प्रतीक हैं, तो पूर्व वर्णों को यह देखने के लिए चेक किया जाता है कि क्या वे एक कमांड हैं जो "कमांड लाइन इंटरप्रेटर" शेल (CMD.EXE) या इसके पूर्ववर्ती COMMAND.COM के लिए आंतरिक है )।

यह जाँचने से पहले किया जा सकता है कि क्या शब्द किसी फ़ाइल या उपनिर्देशिका का उल्लेख कर सकता है। यह cdआदेश के लिए सही है । दुख की बात है कि एक नमूना बनाते समय, मैंने पाया कि copyकमांड के साथ ऐसा नहीं होता है , इसलिए परिणाम असंगत हैं: वे सभी आंतरिक आदेशों के साथ जरूरी नहीं हैं। मैं अपने खोज भी तुलना करने के लिए (बहुत) अन्य आदेशों लाइन नहीं जारी रखने के लिए किया था delऔर dir, तो मैं बस बहुत सावधान किया जा रहा सुझाव है कि अगर आप क्या स्पेस के बिना होता है पर भरोसा करने की कोशिश करते हैं।

अब, इको कमांड के बारे में भी पूछा गया प्रश्न : यह एक असामान्य अपवाद है, जिसमें मुझे लगता echo.है कि डॉस विशेषज्ञों द्वारा काफी प्रसिद्ध है। यह शायद प्रलेखित किया गया था। कम से कम Win7 के CMD में व्यवहार यह है कि यदि कमांड " echo." से शुरू होता है , तो पहली अवधि को अनदेखा कर दिया जाता है। तो, "" echo..hi"के आउटपुट में बदल जाता है .hi"। इसका कारण इतना है कि " echo." का उपयोग रिक्त लाइन को प्रिंट करने के लिए किया जा सकता है। इसके विपरीत, यूनिक्स के साथ, आप इसे केवल " echo" कमांड चलाकर कर सकते हैं । हालाँकि, DOS में, " echo" कमांड को चालू करने से वर्तमान " इको " सेटिंग का उत्पादन होगा । इसी तरह, डॉस Echo *Off*"और" व्यवहार करता हैEcho *On*"विशेष मूल्यों के रूप में जो वर्तमान गूंज सेटिंग को बदलते हैं। यदि आप वास्तव में शब्द को प्रिंट करना चाहते हैं Off", तो " Echo.Off" चाल को कम से कम (माइक्रोसॉफ्ट के सीएमडी कमांड लाइन दुभाषिया के हाल के पर्याप्त संस्करणों के साथ करता है ।)

तो, कम से कम echoकमांड में एक अर्ध-उचित स्पष्टीकरण है। शेष आदेशों के लिए, मैं समझता था कि आंतरिक आदेशों की प्राथमिकता थी। हालांकि, जब मैंने कुछ परीक्षण करने की कोशिश की, तो मैंने पाया कि वास्तव में असंगत है। मैं इसे कुछ उदाहरणों के माध्यम से प्रदर्शित करता हूं जिन्हें मैंने यहां दस्तावेजित किया था।


यहाँ कुछ उदाहरण हैं। मैं एक उन्नत कमांड प्रॉम्प्ट का उपयोग करता था, ताकि UAC मुझे रूट निर्देशिका में लिखने के बारे में नहीं बताए। यह माइक्रोसॉफ्ट विंडोज 7 के CMD.EXE के साथ किया गया था। मुझे लगता है कि व्यवहार अन्य संस्करणों के साथ भिन्न हो सकता है, जैसे पुराने MS-DOS संस्करणों से COMMAND.COM, या अन्य कंपनियों द्वारा जारी सॉफ़्टवेयर (DR-DOS's COMMAND.COM)।

(यह उत्तर पहले से ही काफी लंबा है, इसलिए मैं अपने फाइल सिस्टम पर किए गए सभी गड़बड़ को साफ करने के लिए आदेशों को शामिल नहीं कर रहा हूं। छोटे-से साफ-सुथरा सा है, लेकिन ज्यादा नहीं।)

यहां एक उदाहरण है जो यह साबित करता है कि आंतरिक आदेश पूर्वता बनाता है। (मैं प्रभावी रूप से एक टिप्पणी करने के लिए एक डबल कोलन का उपयोग करने के लिए बल्कि अल्प-ज्ञात क्षमता का प्रदर्शन करता हूं, जो बैच फ़ाइलों में भी अच्छी तरह से काम करता है। तकनीकी रूप से, बैच फ़ाइलों में, इसे एक लेबल के रूप में संसाधित किया जाता है, जिसे GOTO द्वारा नहीं पहुँचा जा सकता है, और समाप्त होता है। REM कमांड से तेज)

C: \ something> md cd
C: \ something> echo echo subdir >> cd \ a.bat
C: \ something> md \ a
c: \ something> । \ Cd \ a.bat
subdir

C: \ something> :: वह उप-सदृश
C: \ something> cd \ a
C: \ a> से चला गया :: :: जिसने मेरी वर्तमान निर्देशिका को बदल दिया, इसलिए cd ने पूर्वता लिया

अद्यतन: आगे के प्रयोग पर, मैंने पाया कि आंतरिक सीडी कमांड केवल फाइल सिस्टम पर पूर्ववर्तीता लेता है यदि निर्दिष्ट निर्देशिका में एक अवधि शामिल नहीं है। इसलिए यदि आपके पास " a.bat " नाम की निर्देशिका है , तो आप " **cd\a.bat**" चला सकते हैं और बैच फ़ाइल चलेगी।

कम सामान्य व्यवहार की खोज (क्योंकि अधिकांश निर्देशिकाओं में संभवतः उनमें अवधि नहीं है) ने मुझे अपने निष्कर्षों को अपडेट करने के लिए प्रेरित किया। यह पता चला है कि सीडी कमांड वास्तव में कॉपी कमांड के समान व्यवहार कर रहा है, जैसा कि मैंने शुरू में सोचा था।

हालांकि मैंने शुरू में सोचा था कि सीडी और कॉपी कमांड अलग-अलग व्यवहार कर रहे थे, मुझे अब पता चला कि नामों के पैटर्न के कारण मैं प्रदान कर रहा था। फिर भी, मैंने अपने पहले के परिणामों की समीक्षा की, और यह निर्धारित किया कि मेरे पहले के दस्तावेज परीक्षण कुछ अंतर दिखाने में मदद करते हैं कि क्या होता है जब एक नाम में एक अवधि और एक एक्सटेंशन शामिल होता है, और जब यह नहीं होता है। इसलिए, मैं अभी भी अपने पुराने निष्कर्षों को शामिल कर रहा हूं (ज्यादातर अपरिवर्तित, लेकिन कुछ बहुत ही मामूली अपडेट के साथ इसलिए जो मैं कहता हूं वह सटीक है)।

एक उदाहरण दिखा रहा है प्रतिलिपि , एक पूर्ण पथ के साथ, एक ही पूर्वता का उपयोग नहीं करता है (आंतरिक कमांड के पक्ष में) सीडी के रूप में जब कोई एक्सटेंशन का उपयोग नहीं किया जाता है:

C: \ something> इको इको रूट >> \ try.bat
C: \ something> md copy
C: \ something> इको इको उपनिर्देशिका >> कॉपी \ try.bat
C: \ something> । \ Copy \ try.bat रन। उपनिर्देशिका
उपनिर्देशिका

C: \ something> copy \ try.bat
उपनिर्देशिका

C: \ something> :: हुह? वह ओवरराइड और रूट से क्यों नहीं चला?
C: \ something> :: जाहिर है, आंतरिक कॉपी कमांड में उपनिर्देशिका और पूर्ण फ़ाइल नाम के लिए चेक पर प्राथमिकता नहीं थी (भले ही आंतरिक सीडी कमांड ने प्राथमिकता दी हो, जब निर्देशिका का कोई विस्तार नहीं था)
C: \ something> ::
C: \ something>:: एक अन्य परीक्षण: मैं अंत में बेकार
सी जोड़ सकता हूं: सी कुछ \ _ > । कॉपी .. \ try.bat
उपनिर्देशिका

C: \ something> :: ठीक है, महान। लेकिन फिर यह उपनिर्देशिका की जाँच नहीं करेगा:
C: \ something> copy .. \ try.bat
        1 फ़ाइल (ओं) की प्रतिलिपि बनाई गई।

C: \ something> :: कि आंतरिक प्रतिलिपि आदेश चला

मेरे शुरुआती निष्कर्षों ने संकेत दिया कि ये परिणाम दर्शाते हैं कि कमांड लाइन शेल प्राथमिकता देता है:

  • फाइलसिस्टम (आंतरिक कॉपी कमांड के बजाय ) जब आंतरिक कमांड के नाम के ठीक बाद बैकस्लैश निर्दिष्ट करता है
  • आंतरिक कमांड के नाम के ठीक बाद बैकस्लैश निर्दिष्ट करते समय आंतरिक सीडी कमांड (फाइलसिस्टम के बजाय)।
  • आंतरिक कमांड के नाम के ठीक बाद की अवधि निर्दिष्ट करते समय आंतरिक कॉपी कमांड (फाइलसिस्टम के बजाय)।

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

(अपडेट: सबसे पहले, मुझे लगा कि विसंगति कार्यक्रमों के बीच अलग-अलग व्यवहार पर आधारित है। बाद में, मुझे पता चला कि विसंगति मौजूद थी, लेकिन प्रदान किए गए मापदंडों से अधिक थी।)

वास्तव में, यहां तक ​​कि उन बुलेट बिंदु भी पूरी तरह से सही नहीं हैं, भले ही मैंने सिर्फ मेरे द्वारा कहे गए प्रत्येक व्यक्ति को प्रदर्शित करने के लिए ऐसा किया था। समस्या यह है कि, बुलेट बिंदुओं की सूची पूरी तरह से सटीक होने के लिए पर्याप्त नहीं है। (मैंने चीजें छोड़ीं, ताकि उन बुलेट बिंदुओं की तुलना अपेक्षाकृत आसानी से की जा सके, और अपेक्षाकृत आसानी से जांचे जा सकें।)

हालाँकि, अधिक सटीक होने के लिए, पहली गोली बिंदु को इंगित करना चाहिए कि कमांड लाइन शेल प्राथमिकता देता है:

  • एक बैकस्लैश को निर्दिष्ट करते समय फाइलसिस्टम (आंतरिक कॉपी कमांड के बजाय ) और आंतरिक कमांड के नाम के ठीक बाद पूर्ण पथ का शेष भाग

निम्नलिखित प्रदर्शित करेगा कि मैं वह भेद क्यों कर रहा हूँ:

C: \ el कहीं और> इस लाइन के लिए echo UAC एलिवेशन की जरूरत है >> \ needext
C: \ el कहीं और> इस लाइन के लिए echo UAC एलिवेशन की जरूरत है >> \ needext.bat
C: \ el कहीं और> md। \ Copy C: / el
अन्य जगह> echo @ Echo subdir >> copy \ needext.bat
C: \ el
others > । \ Copy \ needext subdir

C: \ el
others > copy \ needext.bat subdir

C: \ el others > copy \ needext
        1 फ़ाइल (ओं) की प्रतिलिपि बनाई गई।

C: \ el कहीं> :: UAC को अगली पंक्तियों के लिए भी आवश्यकता होती है
C: \ el others > del \ needext
C: \ el others > del \ needext.bat

(ध्यान दें कि अंतिम कॉपी कमांड फ़ाइल की तलाश में था जिसे \ needext कहा जाता था , क्योंकि आंतरिक कॉपी कमांड का उपयोग किया गया था। फ़ाइल \ needext.bat केवल आसानी से यह दिखाने में मदद करने के लिए बनाई गई थी कि यह कभी भी कमांड लाइनों द्वारा उपयोग नहीं किया गया था जिसमें शब्द कॉपी शामिल थी। ।)

इस बिंदु पर, मैंने एक बैकस्लैश का उपयोग करने पर कुछ असंगतता ( कॉपी कमांड के व्यवहार के साथ) स्थापित की ...

आगे मैं यह प्रदर्शित करूँगा कि इन आज्ञाओं के बीच कुछ सामंजस्य है। (तो, वहाँ स्थिरता है ... उम ... कभी-कभी। हमारे पास केवल असंगतता हो सकती है, असंगत रूप से।) जो मैं आगे दिखाऊंगा वह यह है कि सीडी कमांड कॉपी कमांड की तरह व्यवहार करता है जब एक अवधि का उपयोग किया जाता है। प्रतिलिपि आदेश आंतरिक आदेश का उपयोग करता है, और ऐसा नहीं करता है सीडी आदेश।

C: \ कुछ> md \ yetmore।

C: \ कुछ> सीडी \ yetmore।

C: \ कुछ \ yetmore> md \ md।
C: \ कुछ \ yetmore> गूंज गूंज subdir >> md \ test.bat
C: \ कुछ \ yetmore> । \ md। \ test
subdir

C: \ something \ yetmore> md। \ test

C: \ something \ yetmore> md। \ परीक्षण।
एक उपनिर्देशिका या फ़ाइल। \ परीक्षण पहले से ही मौजूद है।

C: \ something \ yetmore> :: यह त्रुटि दिखाती है कि हमने आंतरिक कमांड चलाया है।
C: \ something \ yetmore> md .. \ test
C: \ something \ yetmore> md। \ Cd
C: \ something \ yetmore> प्रतिलिपि। \ Md cd
। \ Md \ test.bat
        1 फ़ाइल (s) की प्रतिलिपि बनाई गई है।

C: \ something \ yetmore> \ Cd । \ Test
subdir

C: \ something \ yetmore> cd। \ Test
C: \ something \ yetmore \ test> :: आंतरिक कमांड ने एक अवधि के
साथ काम किया C: \ something \ yetmore \ परीक्षण> cd ..
C: \ something \ yetmore> । \ cd .. \ test
subdir

C: \ something \ yetmore> cd .. \ test
C: \ something \ test> :: आंतरिक आदेश ने भी प्राथमिकता दी जब दो अवधियाँ हैं उपयोग किया गया

इसलिए, प्रारंभिक परीक्षण सत्र के दौरान, जो अधिकतर सीडी और कॉपी कमांड पर केंद्रित होता था (कुछ अतिरिक्त उपयोग के साथ md और बिट ऑफ डेल ), एकमात्र समय जब हमारे पास वास्तव में फाइलसिस्टम को प्राथमिकता थी, प्रतिलिपि कमांड के साथ थी , और फिर पूर्ण पथ का उपयोग करते समय फ़ाइल सिस्टम केवल प्राथमिकता ले रहा था।

बाद की समीक्षा के बाद, मैंने पाया कि सीडी कमांड ने एक्सटेंशन का उपयोग करते समय फाइल सिस्टम को भी प्राथमिकता दी है। कम से कम इसका मतलब है कि आंतरिक आदेशों को एक दूसरे के साथ थोड़ा अधिक सुसंगत माना जा रहा है। हालाँकि, इसका यह भी अर्थ है कि हमें फाइल सिस्टम ऑब्जेक्ट्स (फाइलों या निर्देशिकाओं) के नाम के आधार पर अलग-अलग व्यवहार मिलता है। ऐसा लगता है कि व्यवहार कुछ वास्तव में, वास्तव में अस्पष्ट आंतरिक तर्क का उपयोग कर रहा है। इसलिए, अलग-अलग ऑपरेटिंग सिस्टम पर काम करने के लिए इस व्यवहार की गिनती कुछ ऐसा है जिसे मैं शायद करने के लिए असुरक्षित समझूंगा


"आप जिस व्यवहार का वर्णन करते हैं, वह सभी कमांड लाइन इंटरप्रेटर के लिए आंतरिक कमांड के लिए संगत है।" ipconfigउदाहरण के लिए भी काम करता है।
जोनास कोर्ट्ज़

@ JonasKöritz: नहीं। आप " IPConfig " कमांड के ठीक बाद एक (आगे) स्लैश डाल सकते हैं और यह काम करेगा, उदा IPCONFIG/ALL। हालाँकि, यह वह नहीं है जिसके बारे में मैं बात कर रहा था। " आपके द्वारा वर्णित व्यवहार " (आपके प्रश्न में) कमांड नाम के ठीक बाद की अवधि रखने का व्यवहार था। यदि मैं टाइप करता हूं IPConfig.तो मुझे एक कमांड के बारे में एक त्रुटि मिलती है जो नहीं मिल रही है। इसी तरह (हालांकि यह आपके द्वारा बताए गए व्यवहार से संबंधित नहीं है), अगर मैं टाइप करता IPCONFIG\ALLहूं तो मैं एक कस्टम .\IPCONFIG\ALL.BATफ़ाइल चला सकता हूं जो मैंने बनाई थी। तो /की तरह व्यवहार नहीं कर रहे हैं .या `\`
TOOGAM

1
मैं आपके उत्तर को स्वीकार करने के लिए काम और अनुसंधान को बनाने के लिए इसे स्वीकार करूंगा!
जोनास कोर्गित

2
@ कैलाश सरल परीक्षण - निष्पादित करने copy.exeया copy.comcmd में प्रयास करें। यह काम नहीं करता है - यह एक निष्पादन योग्य नहीं है।
13

1
@ लुआन: के बारे में ipconfig, मैं आपके निष्कर्ष से असहमत हूं। यह प्रश्न इस बारे में है कि कमांड लाइन की शुरुआत में क्या टाइप किया जाता है। Windows / DOS फ़ाइल नाम एक्सटेंशन द्वारा निष्पादकों की पहचान करता है, इसलिए आप बिना एक्सटेंशन के (विंडोज में, यूनिक्स के विपरीत जो यह अनुमति देता है) "ipconfig" नामक एक कार्यक्रम नहीं चला सकता है। अगली टिप्पणी के बारे में, मुझे नहीं पता कि "कैलचेस" कौन है। (जब आप एक साइन इन निर्दिष्ट करते हैं, तो आमतौर पर निम्नलिखित उपयोगकर्ता के पहले अक्षर होते हैं जो पृष्ठ पर कहीं और दिखाई देते हैं।) मैं सहमत हूं, चल रहा है " copy.exe" आंतरिक copyकमांड (और पास .exe) का उपयोग करेगा । (आप चला सकते हैं .\copy.exe)
TOOGAM

41

आप मानते हैं कि एक कमांड नाम और उसके तर्कों को विशेष रूप से एक स्थान से अलग किया जाना चाहिए, लेकिन यह सच नहीं है। जब तक मंगलाचरण की स्पष्ट व्याख्या नहीं की जा सकती, तब तक आह्वान मान्य है।

इस मामले में, पहले तर्क के साथ शुरू होता है .और .कमांड नाम का हिस्सा नहीं हो सकता है, इसलिए cdऔर ..बस दो अलग-अलग टोकन के रूप में पार्स किया जाता है।

आमतौर पर, आपका पहला तर्क एक वर्णनात्मक चरित्र (जैसे एक पथ की शुरुआत) के साथ शुरू होगा, इसलिए यह आपके कमांड नाम में "ब्लीड" करेगा और एक त्रुटि का कारण होगा ... लेकिन यह एक वाक्यविन्यास समस्या नहीं है। यह एक शब्दार्थ है।

आप अन्य कमांड के साथ काम पर समान प्रभाव देख सकते हैं, जिसमें शामिल हैं echo:

echo...
..

इस मामले में, हम केवल दो अवधियों मिलता है क्योंकि आदेश अपने आप में एक विशेष नियम है , ताकि निम्नलिखित:echo

echo .

या, विस्तार से, यह:

echo.

केवल एक खाली लाइन आउटपुट करता है। यह एक सुविधा है। जाहिरा तौर पर यह तर्क में एक अग्रणी अवधि की अनदेखी करके लागू किया गया है।

अरे, यह डॉस / बैच है। आप पवित्रता चाहते हैं? : डी


2
मैंने यह मान लिया क्योंकि यह विंडोज़ कमांड लाइन के लिए अद्वितीय है, उदाहरण के लिए बैश आपको ऐसा करने की अनुमति नहीं देगाcd..
जोनास कोर्गित

47
@ JonasKöritz: यह पूरी तरह से अलग ऑपरेटिंग सिस्टम पर एक पूरी तरह से अलग कार्यक्रम है। मेरी साइकिल cd..या तो :) की अनुमति नहीं देती है
ऑर्बिट

15
@ जोनासकोर्ट्ज:alias cd..='cd ..'
मौविसील

5
@LightnessRacesinOrbit: मूल रूप से यह फ़िल्टरिंग का एक शॉर्टकट था .और ..जो हर दूसरी निर्देशिका में निर्देशिकाओं के रूप में दिखाई देते हैं और जहाँ तक मुझे पता है कि इससे अधिक पकड़ने का कभी इरादा नहीं था। मैं वास्तव में छिपी हुई नेस पर विचार करता हूं क्योंकि फ़ाइल नाम से फ़ाइल का पालन करने की तुलना में फाइल क्लीनर की विशेषता है।
जॉय

4
@joey - मुझे लगता है कि अधिक प्रासंगिक बिंदु यह नहीं है कि डॉस दृष्टिकोण सरल था, यह है कि डीओएस ने .फ़ाइल नाम में अनुमति नहीं दी , जिसका मतलब था कि यह कमांड नाम का हिस्सा नहीं हो सकता है इसलिए तर्क का हिस्सा होना चाहिए । यहां तक ​​कि अगर डॉस ने कमांड को यूनिक्स के गोले के रूप में तर्कों में विभाजित किया था, तब भी यह .कमांड के बाद पहले तर्क में जगह देगा, क्योंकि यह कमांड नाम में एक अमान्य चरित्र डालने का कोई मतलब नहीं होगा।
जूल्स

19

cd..आदेश सही है और यह है कि मूल आदेश दुभाषिया में तरह परिभाषित किया गया था command.comजो बाद में नामित किया गया था cmd.exe

कमांड दुभाषिया को पता है कि कैसे प्रक्रिया करना है cd.., क्योंकि .एक विशेष चरित्र है, जैसे \


8
मुझे लगता है कि मुख्य मुद्दा यह है कि कमांड "वाक्यविन्यास गलत" नहीं हो सकता है क्योंकि वाक्यविन्यास औपचारिक रूप से कहीं भी निर्दिष्ट नहीं है , इसलिए यदि प्राथमिक कार्यान्वयन (cmd.exe और / या MS-DOS) इसे स्वीकार करता है, तो इसे सही होना होगा।
विशाल

3
इसके अलावा, सीडी एक प्रोग्राम नहीं है, बल्कि एक आंतरिक कमांड है। इको के समान जो एक आंतरिक कमांड भी है, इसे काम करने के लिए स्थान की आवश्यकता नहीं है। echo.साथ ही साथ काम करता है, जो एक खाली लाइन प्रिंट करेगा।
LPChip

2
@ ऑवरमाइंड इको या तो काम नहीं करेगा, इसलिए इसका cd, इको, md, आदि के साथ समान है
LPChip

2
@ JonasKöritz, .गिराया नहीं गया है, लेकिन सिर्फ एक स्थान जोड़ा गया है। md.testऔर md .testदोनों डायरेक्टरी बनाते हैं .test। टाइपिंग cd.testऔर cd .testनिर्देशिका में बदल जाएगा .test
daniel.neumann

6
@ जोनासकोर्ट्ज: क्योंकि वाक्य-विन्यास कभी भी कमांड-स्पेस-तर्क नहीं रहा है।
ऑर्बिट

11

यह एक पश्चगामी संगतता हैक है।

कमांड लाइन दुभाषिया को मूल MSDOS कमांड दुभाषिया से कमांड के साथ पीछे की ओर संगत करने के लिए डिज़ाइन किया गया है, जिसे CP / M कमांड दुभाषिया के साथ पीछे की ओर संगत करने के लिए डिज़ाइन किया गया था। न तो सीपी / एम और न ही एमएसडीओएस ने एक .फ़ाइल नाम में अनुमति दी (इसे फ़ाइल नाम के दो हिस्सों, आधार नाम और विस्तार के बीच एक विभाजक के रूप में व्याख्या की गई थी)। इसका मतलब यह था कि (कम से कम DOS के शुरुआती संस्करणों के लिए), कमांड दुभाषिया यह पहचान सकता है कि अगर वह '' पर पहुंच गया। (या वास्तव में कोई अन्य चरित्र जो एक फ़ाइल नाम में अवैध था) यह कमांड नाम के अंत में पारित हुआ और कमांड तर्क में था। यह आमतौर पर डॉस और सीपी / एम - दोनों में उपयोग किया जाता dir/wथा , उदाहरण के लिए, एक बहुत ही सामान्य कमांड था, dir /wजो क्षैतिज प्रारूप में फाइलों को सूचीबद्ध करने के लिए अर्थ के बराबर था ।

आजकल, '।' फ़ाइल नाम में दिखाई दे सकते हैं। यह आदेशों को पार्स करने के तरीके में कुछ जटिलताओं का कारण बनता है, लेकिन शेल अभी भी पहचानता है .कि तर्कों की शुरुआत के रूप में सटीक फ़ाइल नाम का हिस्सा नहीं है। यह बड़े पैमाने पर आवश्यक है क्योंकि लाखों उपयोगकर्ता cd..बड़ी संख्या में बैच फ़ाइलों का उपयोग करने के लिए उपयोग किए गए हैं, जिनमें बड़ी संख्या में बैच फ़ाइलें हैं या echo.अन्य समान आदेश हैं।

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