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


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

Working but shouldn't?

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

echo..


86
2018-06-06 10:32


मूल


आपके प्रश्न का आधार टूटा हुआ प्रतीत होता है। क्या आप अपने दावे के लिए कोई सबूत प्रदान कर सकते हैं कि यह वाक्य रचनात्मक रूप से गलत है? - Lightness Races in Orbit
मुझे नहीं लगता कि "कमांड <स्पेस> तर्क" कभी भी रहा है मानक cmd (या इसके पूर्ववर्ती किसी भी) में प्रारूप; उदाहरण के लिए विचार करें dir/a या समान वीएमएस वाक्यविन्यास। - grawity
सीडी बहुत खास है। आपको लिखना आता है cd c:\program files उद्धरण के बिना और यह अभी भी काम करता है - phuclv
यहां एक बहुत ही मनोरंजक लेख है जो विंडोज शैल तर्क के quirks बताता है, और यह क्या कारण हो सकता है: thedailywtf.com/articles/The-Core-Launcher - vsz
क्यों करता है cd.. काम? क्योंकि माइक्रोसॉफ्ट स्पष्ट रूप से इसे काम करने की परेशानी से गुजर गया। cd विंडोज कमांड दुभाषिया में बनाया गया एक आदेश है, और माइक्रोसॉफ्ट अपने दुभाषिया को जो भी चाहें कर सकता है। (एक और उदाहरण के रूप में, cd नाम में रिक्त स्थान के साथ निर्देशिकाओं के चारों ओर उद्धरण की भी आवश्यकता नहीं है।) - jamesdlin


जवाब:


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

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

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

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

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

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


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

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

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

C: \ कुछ> एमडी सीडी
C: \ कुछ> गूंज गूंज subdir >> सीडी \ a.bat
C: \ कुछ> एमडी \ ए
C: \ कुछ> । \ सीडी \ a.bat
subdir

C: \ कुछ> :: वह उपदीर से भाग गया
C: \ कुछ> सीडी \ एक
C: \ एक> :: यह मेरी वर्तमान निर्देशिका बदल गया, तो सीडी प्राथमिकता ली

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

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

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


105
2018-06-06 19:43



"आपके द्वारा वर्णित व्यवहार कमांड लाइन दुभाषिया के लिए आंतरिक सभी आदेशों के लिए संगत है।" ipconfig उदाहरण के लिए भी काम करता है। - Jonas Köritz
@ जोनासकोइटज़: नहीं। आप कमांड के बाद एक (आगे) स्लैश डाल सकते हैं "ipconfig"और वह काम करेगा, उदा। IPCONFIG/ALL। हालांकि, यह वही नहीं है जिसके बारे में मैं बात कर रहा था। "व्यवहार जो आप वर्णन करते हैं"(आपके प्रश्न में) कमांड नाम के ठीक बाद एक अवधि रखने का व्यवहार था। अगर मैं टाइप करता हूं IPConfig. तो मुझे एक कमांड के बारे में कोई त्रुटि नहीं मिली है। इसी तरह (हालांकि यह उस व्यवहार से संबंधित नहीं है जिसका आप वर्णन कर रहे थे), अगर मैं टाइप करता हूं IPCONFIG\ALLतो मैं एक कस्टम चला सकते हैं .\IPCONFIG\ALL.BAT फाइल जो मैंने बनाई थी। इसलिए /की तरह व्यवहार नहीं किया जाता है . या `\` - TOOGAM
मैं इसे बनाने के लिए किए गए कार्यों और शोध की सराहना करने के लिए आपका उत्तर स्वीकार करूंगा! - Jonas Köritz
@Calchas सरल परीक्षण - निष्पादन का प्रयास करें copy.exe या copy.com cmd में यह काम नहीं करता है - यह निष्पादन योग्य नहीं है। - Luaan
@ लुआन: के बारे में ipconfig, मैं आपके निष्कर्ष से असहमत हूं। यह प्रश्न कमांड लाइन की शुरुआत में किस प्रकार टाइप किया गया है इसके बारे में है। विंडोज / डॉस फ़ाइल नाम एक्सटेंशन द्वारा एक्जिक्यूटिव को पहचानता है, इसलिए आप बिना किसी एक्सटेंशन के "ipconfig" नामक प्रोग्राम चला सकते हैं (विंडोज़ में, यूनिक्स के विपरीत जो इसे अनुमति देता है)। अगली टिप्पणी के बारे में, मुझे नहीं पता कि "कैल्चा" कौन है। (जब आप एक संकेत पर निर्दिष्ट करते हैं, तो आमतौर पर उपयोगकर्ता के पहले अक्षर होते हैं जो पृष्ठ पर कहीं और दिखाते हैं।) मैं सहमत हूं, "copy.exe"आंतरिक का उपयोग करेगा copy आदेश (और पास .exe)। (तुम दौड़ सकते हो .\copy.exe) - TOOGAM


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

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

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

आप अन्य आदेशों के साथ काम पर एक ही प्रभाव देख सकते हैं echo:

echo...
..

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

echo .

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

echo.

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

हे, यह डॉस / बैच है। आप सैनिटी चाहते हैं? : डी


41
2018-06-06 11:35



मैंने यह माना क्योंकि यह विंडोज कमांड लाइन के लिए अद्वितीय है, उदाहरण के लिए बैश आपको ऐसा करने की अनुमति नहीं देगा cd.. - Jonas Köritz
@ जोनासकोइटज़: यह एक पूरी तरह से अलग ऑपरेटिंग सिस्टम पर एक पूरी तरह से अलग कार्यक्रम है। मेरा साइकिल अनुमति नहीं देता है cd.. या तो :) - Lightness Races in Orbit
@ JonasKöritz: alias cd..='cd ..' - mouviciel
@ लाइटनेसरेसेसिन ऑर्बिट: मूल रूप से यह फ़िल्टरिंग का शॉर्टकट था . तथा .. जो हर दूसरी निर्देशिका में निर्देशिका के रूप में दिखाई देता है और जहां तक ​​मुझे पता है कि उससे अधिक पकड़ने का इरादा कभी नहीं था। मैं वास्तव में फ़ाइल नाम से स्पष्ट रूप से अनुसरण करने की तुलना में फ़ाइल विशेषता के रूप में एक विशेषता डिजाइन के रूप में छिपी हुई छिपी-नस्ल पर विचार करता हूं। - Joey
@joey - मुझे लगता है कि अधिक प्रासंगिक बिंदु यह नहीं है कि डॉस दृष्टिकोण सरल था, यह वह है डॉस की अनुमति नहीं थी . फाइलनाम में, जिसका मतलब था कमांड नाम का हिस्सा नहीं हो सका इसलिये तर्क का हिस्सा होना चाहिए। भले ही डॉस ने यूनिक्स शैल के रूप में कमांड को कमांड में विभाजित किया हो, फिर भी यह एक जगह रखेगा . पहले तर्क में कमांड के बाद, क्योंकि किसी अमान्य चरित्र को कमांड नाम में डालने का कोई मतलब नहीं होगा। - Jules


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

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


19
2018-06-06 10:43



मुझे लगता है कि मुख्य मुद्दा यह है कि कमांड वाक्यविन्यास के कारण "वाक्यगत रूप से गलत" नहीं हो सकता है औपचारिक रूप से कहीं भी निर्दिष्ट नहीं है, इसलिए यदि प्राथमिक कार्यान्वयन (cmd.exe और / या MS-DOS) इसे स्वीकार करता है, तो इसे सही होना चाहिए। - grawity
इसके अलावा, सीडी एक कार्यक्रम नहीं है, बल्कि एक आंतरिक आदेश है। इको की तरह जो आंतरिक आदेश भी है, इसे इसके लिए काम करने की आवश्यकता नहीं है। echo. बस काम करता है, जो एक खाली रेखा मुद्रित करेगा। - LPChip
@ ओवरमाइंड इको या तो काम नहीं करेगा, इसलिए सीडी, इको, एमडी इत्यादि के साथ यह वही है। - LPChip
@ जोनासकोइटज़, द . गिराया नहीं गया है लेकिन केवल एक जगह जोड़ा गया है। md.test तथा md .test दोनों निर्देशिका बनाते हैं .test। टाइपिंग cd.test तथा cd .test निर्देशिका में बदल जाएगा .test। - daniel.neumann
@ जोनासकोइटज़: क्योंकि सिंटैक्स कभी कमांड-स्पेस-तर्क नहीं रहा है। - Lightness Races in Orbit


यह एक पिछड़ा संगतता हैक है।

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

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


11
2018-06-06 14:55