web-dev-qa-db-fra.com

Pourquoi "cd .." fonctionne-t-il dans la ligne de commande Windows?

Lors de la saisie de cd.. sans espace entre cd et .., la commande Windows Invite passera avec plaisir dans le dossier parent. Y a-t-il une explication à ce comportement? La commande ne suit pas le format standard de command<space>arguments

 Working but shouldn't?

Aussi, pourquoi cela ne crée-t-il pas des résultats cohérents?

 echo..

86
Jonas Köritz

Vous supposez qu'un nom de commande et ses arguments doivent être séparés par un espace, en particulier, mais ce n'est pas vrai. Tant que l'invocation peut être interprétée sans ambiguïté, l'invocation est valide.

Dans ce cas, le premier argument commence par . et . ne peut pas faire partie du nom de la commande. Par conséquent, cd et .. sont simplement analysés sous la forme de deux jetons distincts.

Habituellement, votre premier argument commence par un caractère alphabétique (par exemple, le début d'un chemin), ainsi, il "coulera" dans le nom de votre commande et provoquera une erreur… mais ce n'est pas un problème de syntaxe. C'est une sémantique.

Vous pouvez voir le même effet au travail avec d'autres commandes, y compris echo:

echo...
..

Dans ce cas, nous n'obtenons que deux points car la commande echo a elle-même une règle spéciale , de sorte que:

echo .

ou, par extension, ceci:

echo.

affiche uniquement une ligne vide. C'est une commodité. Apparemment, cela a été mis en œuvre en ignorant une période de pointe dans l'argument.

Hé, c'est DOS/Batch. Vous voulez la santé mentale? :RÉ

La commande cd.. est correcte et elle a été définie de la même manière que dans l'interpréteur de commande d'origine command.com qui s'appellera plus tard cmd.exe.

L'interpréteur de commandes sait comment traiter cd.., car . est un caractère spécial, tout comme \.

19
Overmind

C'est un hack de compatibilité ascendante.

L'interpréteur de ligne de commande est conçu pour être rétro-compatible avec les commandes de l'interpréteur de commandes MSDOS d'origine, qui a été conçu pour être rétro-compatible avec l'interpréteur de commandes CP/M. Ni CP/M ni MSDOS n'autorisaient un . dans un nom de fichier (il était interprété comme un séparateur entre deux parties du nom de fichier, le nom de base et l'extension). Cela signifiait que (du moins pour les premières versions de DOS), l'interpréteur de commande pourrait l'identifier s'il atteignait un '.' (ou bien tout autre caractère qui était illégal dans un nom de fichier), il passait la fin du nom de la commande et figurait dans les arguments de la commande. Ceci était assez couramment utilisé à la fois sous DOS et CP/M - par exemple, dir/w était une commande très courante, équivalente à dir /w, ce qui signifie lister les fichiers au format horizontal.

Aujourd'hui, '.' peut apparaître dans les noms de fichiers. Cela entraîne certaines complications lors de l'analyse des commandes, mais Shell toujours identifie un . qui ne fait pas partie d'un nom de fichier exact comme étant le début des arguments. Cela est principalement dû au fait que des millions d’utilisateurs se sont habitués à taper cd.. ou à disposer d’un grand nombre de fichiers de traitement par lots contenant ce nom ou echo. ou un nombre quelconque de commandes similaires.

11
Jules