Vos attentes sont basées sur DOS Think / Windows Think et sont fausses. Sur MS-DOS, Windows et même sur quelques autres systèmes d'exploitation IBM / Microsoft, le développement des caractères génériques est effectué par la commande elle-même. Des éléments tels que l' /aoption de la dircommande agissent comme des filtres d'attributs lors du développement des caractères génériques. dirétend les caractères génériques tels que ceux *que l'interpréteur de commande lui transmet tels quels, et si /aspécifié, il applique les filtres appropriés à ce qui est renvoyé. (Sur certains systèmes d'exploitation, les filtres d'attributs peuvent être attribués à l'appel système pour énumérer un répertoire et le noyau du système d'exploitation, ou ses pilotes de système de fichiers, les applique eux-mêmes.)
Sous Unices et Linux, l’extension des caractères génériques est effectuée par le shell et n’est pas liée aux autorisations. Quand, dans le répertoire racine, vous faites
ls *
ce que la lscommande elle-même reçoit du shell (quelque chose comme)
ls bin accueil opt var démarrage dev tmp etc perdu + racine trouvée usr
L’ option -d/ désactive ce qui se passe normalement ensuite . Ce qui se passe ensuite ensuite, c’est que chacun de ses arguments est examiné, qu’il s’agit de répertoires et qu’il décide d’énumérer son contenu. Pour les arguments qui nomment des fichiers, il n’imprime que les informations relatives au fichier lui-même. Avec l' option, les répertoires sont traités comme des fichiers. Donc, imprime les informations pour chacun des répertoires qui sont passées en tant qu'arguments, exactement comme s'il s'agissait de fichiers.--directoryls-dls
Donc, ce -d n'est pas une option "imprimer uniquement les répertoires". En fait, non seulement cette option n’existe pas; il ne peut y avoir une telle option. L’exploitation des caractères génériques est effectuée par le shell et (dans un POSIX shau moins), il n’ya aucun moyen de demander au shell de vérifier les bits d’autorisation et de type de fichier lorsqu’il se développe *dans une liste de noms. Pour obtenir une liste des noms de répertoires uniquement, il est nécessaire d'utiliser la findcommande, comme expliqué par ztank1013ou d'utiliser le truc selon lequel un chemin d'accès se terminant par une barre oblique implique l'entrée du répertoire ., comme expliqué par Jin. ( JinL'astuce finit avec la lscommande recevant les arguments
ls bin / home / opt / var / boot / dev / tmp / etc / lost + found / root / usr /
parce que le modèle */fait en réalité correspondre les chemins d'accès avec deux composants, le second étant vide, et ne fait donc pas tout à fait ce qui était souhaité. En particulier, les liens symboliques pointant vers des répertoires seront traités comme s'il s'agissait de répertoires.)
Le comportement de ls -dsans *est une simple extension de ce qui précède. Il suffit simplement de savoir une dernière chose à propos de ls: quand aucun argument n’est donné, cela suppose un argument par défaut de .. Désormais, sans cette -doption, le comportement susmentionné conduit au contenu du répertoire nommé par .énumération et à l'affichage des informations relatives à son contenu. Avec l' -doption, le répertoire .est traité comme s'il s'agissait d'un fichier et ses propres informations sont affichées, plutôt que son contenu énuméré.