سؤال لماذا يعمل "cd .." في سطر أوامر Windows؟


عند الكتابة cd.. دون فراغ بين cd و .. سوف ينتقل موجه الأوامر Windows بسعادة إلى المجلد الأصل. هل هناك تفسير لهذا السلوك؟ لا يتبع الأمر التنسيق القياسي لـ command<space>arguments

Working but shouldn't?

أيضا ، لماذا هذا لا يخلق نتائج متسقة؟

echo..


86
2018-06-06 10:32


الأصل


يبدو أن مقدمة سؤالك تتعطل. هل يمكنك تقديم أي دليل على ادعائك بأن هذا غير صحيح من الناحية التركيبية؟ - Lightness Races in Orbit
لا اعتقد ان "القيادة <الفضاء> الحجج" من اي وقت مضى اساسي تنسيق في كمد (أو أي من predecorsors) ؛ النظر على سبيل المثال dir/a أو بنية VMS مماثلة. - grawity
مؤتمر نزع السلاح هو خاص جدا. يمكنك كتابة cd c:\program files بدون علامات اقتباس ولا يزال يعمل - phuclv
في ما يلي مقالة مسلية للغاية تشرح مراوغات منطق Windows shell ، وما هي الفوضى التي يمكن أن تسببها: thedailywtf.com/articles/The-Core-Launcher - vsz
لماذا cd.. عمل؟ لأن مايكروسوفت مرت بصعوبة جعلها تعمل بشكل واضح. cd هو أمر مدمج في مترجم الأوامر الخاص بـ Windows ، ويمكن لـ Microsoft أن تجعل مترجمها يفعل ما يريد. (كمثال آخر ، cd أيضا لا تحتاج إلى اقتباس حول الدلائل بمسافات في الاسم.) - jamesdlin


الأجوبة:


كما لاحظ البعض من الإجابات / التعليقات الأخرى ، فإن الفكرة القائلة بوجوب وجود مسافة بعد الأمر غير صحيحة. من الأمثلة المعروفة على ذلك أنه يمكنك كتابة شرطة مائلة للأمام بعد أمر ، دون الحاجة إلى مساحة أولاً.

ومع ذلك ، هناك سلوك آخر أقل فهمًا ، ويسمح بـ "cd.."الذي تسأل عنه. يسمح هذا السلوك أيضًا بـ"cd\"للعمل.

السلوك الذي تصفه متناسق مع كافة الأوامر الداخلية لمترجم سطر الأوامر. إذا كان لديك رموز معينة ، بما في ذلك نقطة أو شرطة مائلة للأمام أو شرطة مائلة عكسية ، يتم التحقق من الأحرف السابقة لمعرفة ما إذا كانت هي أمر داخلي لقذيفة "مفسر سطر الأوامر" (CMD.EXE أو سابقه COMMAND.COM ).

قد يتم ذلك قبل التحقق مما إذا كانت الكلمة قد تشير إلى ملف أو دليل فرعي. هذا صحيح بالنسبة لل cd أمر. بشكل مأساوي ، عند تقديم عينة ، وجدت أن هذا لا يحدث مع copy الأمر ، لذلك النتائج غير متناسقة: فهي ليست بالضرورة نفسها مع جميع الأوامر الداخلية. لم أقم بمتابعة بحثي لمقارنة خط الأوامر (كثيرًا) الآخر del و dirلذلك أقترح توخي الحذر الشديد إذا حاولت الاعتماد على ما يحدث بدون مساحة.

الآن ، طرح السؤال أيضا عن صدى صوت الأمر: هذا استثناء غير عادي ، في اعتقادي echo. هو معروف إلى حد كبير من قبل خبراء DOS. هذا ربما تم توثيقه. السلوك ، على الأقل في Win7 CMD، هو أنه إذا بدأ الأمر "echo."، ثم يتم تجاهل الفترة الأولى. لذلك ،"echo..hi"يتحول إلى خرج".hi". السبب في ذلك هو أن"echo."يمكن استخدامها لطباعة سطر فارغ. في المقابل ، مع يونكس ، يمكنك القيام بذلك ببساطة عن طريق تشغيل"echo"الأمر من تلقاء نفسه. ومع ذلك ، في دوس ، تشغيل"echo"الأمر بنفسه سيخرج التيار"صدى صوت"الإعداد. وبالمثل ، يعامل DOS"Echo *Off*"و"Echo *On*"كقيم خاصة تقوم بتغيير إعداد echo الحالي. إذا كنت تريد بالفعل طباعة الكلمة"Off"، ثم "Echo.Off"هل الخدعة (على الأقل مع الإصدارات الأخيرة كافية من مايكروسوفت CMD مترجم سطر الأوامر.)

لذا ، على الأقل echo الأمر له تفسير شبه معقول. بالنسبة إلى الأوامر المتبقية ، كنت أعتقد أن الأوامر الداخلية لها الأولوية. ومع ذلك ، عندما حاولت إجراء بعض الاختبارات ، وجدت أنه في الواقع غير متناسق إلى حد ما. أقوم بعرض هذا من خلال بعض الأمثلة التي وثقتها هنا.


وهنا بعض الأمثلة. لقد استخدمت موجه أوامر غير مقيد ، بحيث لن يشتغل UAC عني بالكتابة إلى الدليل الجذر. تم ذلك مع CMD.EXE الخاص بـ Microsoft Windows 7. أعتقد أن السلوكيات قد تكون مختلفة مع الإصدارات الأخرى ، مثل COMMAND.COM من الإصدارات MS-DOS الأقدم أو البرامج التي تم إصدارها من قبل الشركات الأخرى (COMMAND.COM DR- DOS).

(هذه الإجابة طويلة إلى حد ما بالفعل ، لذلك لا أذكر الأوامر اللازمة لتنظيف كل الفوضى التي ارتكبتها على نظام الملفات الخاص بي. هناك القليل من التنظيف ، ولكن ليس كثيرًا).

هنا مثال يثبت أن الأمر الداخلي يخلق الأسبقية. (أقوم أيضًا بعرض القدرة غير المعروفة إلى حد كبير على استخدام نقرتين مزدوجتين للتعليق بفعالية ، والتي تعمل أيضًا بشكل جيد في الملفات الدفعية. من الناحية الفنية ، في الملفات الدفعية ، تتم معالجتها كتسمية لا يمكن الوصول إليها بواسطة GOTO ، وتنتهي حتى يكون أسرع من الأمر REM.)

C: \ شيء> ام دي مؤتمر نزع السلاح
C: \ شيء> صدى صوت صدى subdir >> cd \ a.bat
C: \ شيء> md \ a
C: \ شيء> . \ CD \ a.bat
subdir

C: \ شيء> :: ركض هذا من subdir
C: \ شيء> مؤتمر نزع السلاح \ ل
C: \ أ> :: التي غيرت دليلي الحالي ، لذلك القرص المضغوط تولى الأسبقية

تحديث: على مزيد من التجارب ، وجدت أن الداخلية القرص المضغوط يأخذ الأمر الأسبقية فقط على نظام الملفات إذا كان الدليل المحدد لا يتضمن نقطة. لذلك إذا كان لديك دليل باسم "خفاش"، ثم يمكنك تشغيل"**cd\a.bat**"وسيتم تشغيل الملف الدفعي.

هذا التنقيب عن سلوك أقل شيوعًا (نظرًا لأن معظم الدلائل ربما لم يكن لها فترات فيها) قادني إلى تحديث النتائج التي توصلت إليها. اتضح أن القرص المضغوط الأمر يتصرف في الواقع أكثر مماثلة ل نسخ الأمر مما اعتقدت في البداية.

على الرغم من أنني اعتقدت في البداية القرص المضغوط و نسخ كانت الأوامر تتصرف بشكل مختلف ، الآن برزت ذلك بسبب نمط الأسماء التي كنت أقدمها. ومع ذلك ، راجعت نتائجي السابقة ، وحددت أن اختباراتي السابقة الموثقة تساعد على إظهار بعض الاختلاف بين ما يحدث عندما يتضمن الاسم فترة وامتدادًا ، وعندما لا يحدث ذلك. لذلك ، ما زلت أضمِّن النتائج القديمة الخاصة بي أدناه (في الغالب دون تغيير ، ولكن مع بعض التحديثات الطفيفة للغاية لذا فإن ما أقوله دقيق).


105
2018-06-06 19:43



"السلوك الذي تصفه متناسق مع كافة الأوامر الداخلية لمترجم سطر الأوامر." ipconfig على سبيل المثال يعمل أيضا. - Jonas Köritz
@ JonasKöritz: لا. يمكنك وضع شرطة مائلة (أمامية) بعد الأمر "إيبكنفيغ"وهذا سيعمل ، على سبيل المثال ، IPCONFIG/ALL. ومع ذلك ، هذا ليس ما كنت أتحدث عنه. "السلوك الذي تصفه"(في سؤالك) كان سلوك وضع فترة مباشرة بعد اسم الأمر. إذا كتبت IPConfig. ثم أحصل على خطأ حول عدم العثور على أمر. وبالمثل (على الرغم من أن هذا لا يرتبط بالسلوك الذي كنت تصفه) ، إذا كنت أكتب IPCONFIG\ALLثم يمكنني تشغيل مخصص .\IPCONFIG\ALL.BAT الملف الذي قمت به. وبالتالي /لا تعامل مثل . أو `` - TOOGAM
سأقبل إجابتك لنقدر العمل والبحث الذي استغرقه لإنشائه! - Jonas Köritz
Calchas اختبار بسيط - حاول التنفيذ copy.exe أو copy.com في كمد. لا يعمل - إنه ليس قابل للتنفيذ. - Luaan
Luann: فيما يتعلق ipconfig، أنا لا أوافق على استنتاجك. هذا السؤال هو حول ما هو مكتوب في بداية سطر الأوامر. يحدد Windows / DOS الملفات التنفيذية بواسطة ملحق اسم الملف ، لذلك لا يمكنك تشغيل برنامج يسمى "ipconfig" بدون ملحق (في Windows ، على عكس Unix الذي يسمح بذلك). فيما يتعلق بالتعليق التالي ، لا أعرف من هو "كالتشاس". (عندما تقوم بتحديد علامة "تسجيل" ، فإن ما يلي هو عادة الأحرف الأولى للمستخدم الذي يظهر في مكان آخر على الصفحة.) أوافق ، تشغيل "copy.exe"سوف تستخدم الداخلية copy القيادة (وتمرير .exe). (يمكنك الجري .\copy.exe) - TOOGAM


تفترض أنه يجب فصل اسم الأمر ووسائطه بمسافة ، على وجه التحديد ، ولكن هذا ليس صحيحًا. وطالما يمكن تفسير الاستدعاء بشكل لا لبس فيه ، فإن الاحتجاج يكون صحيحًا.

في هذه الحالة ، تبدأ الوسيطة الأولى بـ . و . لا يمكن أن يكون جزء من اسم الأمر ، لذلك cd و .. يتم تحليلها ببساطة كرموزان منفصلتان.

عادة ، ستبدأ حجةك الأولى بحرف أبجدي (على سبيل المثال بداية المسار) ، لذلك سوف "ينزف" إلى اسم الأمر الخاص بك ويتسبب في حدوث خطأ ... ولكن هذه ليست مشكلة في بناء الجملة. انها واحدة الدلالي.

يمكنك أن ترى نفس التأثير في العمل مع الأوامر الأخرى ، بما في ذلك echo:

echo...
..

في هذه الحالة ، نحصل على فترتين فقط لأن ال echo الأمر نفسه لديه قاعدة خاصة، بحيث ما يلي:

echo .

أو ، بالتبعية ، هذا:

echo.

يخرج فقط خط فارغ. انها الراحة. على ما يبدو تم تنفيذه عن طريق تجاهل فترة رائدة في الحجة.

مهلا ، هذا هو دوس / الدفعة. تريد العقل؟ :د


41
2018-06-06 11:35



افترضت ذلك لأنها فريدة من نوعها لسطر الأوامر ويندوز ، باش على سبيل المثال لن تسمح لك القيام به cd.. - Jonas Köritz
@ JonasKöritz: هذا برنامج مختلف تمامًا عن نظام تشغيل مختلف تمامًا. دراجتي لا تسمح بذلك cd.. إما :) - Lightness Races in Orbit
@ JonasKöritz: alias cd..='cd ..' - mouviciel
LightnessRacesinOrbit: في الأصل كان اختصارًا للتصفية . و .. التي تظهر كدليل في كل دليل آخر وعلى حد علمي لم يكن القصد منه أبداً أن يمسك أكثر من ذلك. أنا أعتبر في الواقع أن ness نموذجًا كملف ينسب تصميمًا أنظفًا من أن يتبعه بشكل ضمني من اسم الملف. - Joey
joey - أعتقد أن النقطة الأكثر ملاءمة ليست أن أسلوب DOS كان أبسط ، إنه كذلك دوس لم يسمح . في أسماء الملفاتمما يعني ذلك لا يمكن أن يكون جزءًا من اسم الأمر وبالتالي يجب أن يكون جزءًا من الحجة. حتى لو كانت دوس قد قسمت الأمر إلى حجج كما تفعل أصداف يونكس، فإنها ستستمر في وضع . بعد الأمر في الوسيطة الأولى ، لأنه لن يكون من المنطقي وضع حرف غير صالح في اسم الأمر. - Jules


ال cd..الأمر صحيح وتم تعريفه مثل ذلك في مترجم الأوامر الأصلي command.comوالتي سميت في وقت لاحق cmd.exe.

مترجم الأوامر يعرف كيفية معالجة cd..، لان . هي شخصية مميزة ، تمامًا مثل \.


19
2018-06-06 10:43



أعتقد أن المسألة الرئيسية هي أن الأمر لا يمكن أن يكون "غير صحيح من الناحية التركيبية" لأنه بناء الجملة غير محدد رسميا في أي مكان، لذلك إذا كان التنفيذ الأساسي (cmd.exe و / أو MS-DOS) يقبل ذلك ، فإنه يجب أن يكون صحيحًا. - grawity
أيضا ، CD ليس برنامج ، بل أمر داخلي. على غرار صدى والذي هو أيضا أمر داخلي ، فإنه لا يحتاج إلى مساحة للعمل. echo. يعمل كذلك ، والتي ستطبع خط فارغ. - LPChip
لن يعملOvermind echoe سواء ، لذلك هو نفسه مع cd ، echo ، md ، إلخ. - LPChip
@ JonasKöritz ، . لا يتم إسقاطه ولكن يتم إضافة مسافة فقط. md.test و md .test كلاهما إنشاء الدليل .test. الكتابة cd.test و cd .test سوف يتغير في الدليل .test. - daniel.neumann
@ JonasKöritz: نظرًا لأن بناء الجملة لم يكن أبدًا وسيطًا لمساحة الأوامر. - Lightness Races in Orbit


انها اختراق التوافق إلى الوراء.

تم تصميم مترجم سطر الأوامر ليكون متوافقاً مع الأوامر من مترجم أوامر MSDOS الأصلي ، والذي تم تصميمه ليكون متوافقاً مع مترجم الأوامر CP / M. لا يسمح CP / M ولا MSDOS . في اسم الملف (تم تفسيره على أنه فاصل بين جزأين من اسم الملف ، الاسم الأساسي والامتداد). هذا يعني أنه (على الأقل بالنسبة للإصدارات المبكرة من DOS) ، يمكن لمترجم الأوامر أن يحدد أنه إذا وصل إلى "." (أو في الواقع أي حرف آخر غير قانوني في اسم الملف) مرت نهاية اسم الأمر وكان في وسائط الأمر. كان هذا شائع الاستخدام في كل من DOS و CP / M - على سبيل المثال ، dir/w كان أمر شائع جدا ، أي ما يعادل dir /w يعني أن قائمة الملفات في تنسيق أفقي.

الوقت الحاضر، '.' يمكن أن تظهر في أسماء الملفات. هذا يسبب بعض التعقيدات في كيفية تحليل الأوامر ، ولكن قذيفة ما يزال يحدد . هذا ليس جزءًا من اسم الملف الدقيق باعتباره بداية الحجج. وهذا ضروري إلى حد كبير لأن ملايين المستخدمين قد اعتادوا على الكتابة cd.. أو لديك أعداد كبيرة من الملفات الدفعية التي تحتوي على ذلك أو echo. أو أي عدد من الأوامر المشابهة الأخرى.


11
2018-06-06 14:55