Faites défiler vers le bas …
Les noms de fichiers .
et ..
sont toujours ignorés lorsque GLOBIGNORE
est défini et non null.
La plupart du temps, il n'est pas souhaitable d'inclure .
et ..
de correspondances génériques, car ils ne représentent pas des fichiers dans le répertoire - ce sont des hacks pour faire fonctionner la navigation dans le répertoire. En fait, l'origine des fichiers dot est un bogue dans une première version de la ls
commande . L'auteur voulait exclure .
et ..
de la liste, mais a accidentellement exclu tous les fichiers qui commencent par .
. Ainsi, les fichiers de points sont devenus cachés ls
. Les obus ont emboîté le pas en cachant les fichiers dot comme ls
. Cependant, la façon dont cela a été fait était à nouveau un hack: les fichiers commençant par .
ne sont exclus que si le point ne correspond pas explicitement dans le modèle. Ainsi, le modèle .*
comprend .
et ..
.
Pour préserver la compatibilité avec les scripts existants, les shells modernes incluent toujours .
et ..
(à l'exception de zsh, qui sur ce problème, comme beaucoup d'autres, a un comportement plus sain mais pas rétrocompatible). Cependant, si vous définissez GLOBIGNORE
, vous utilisez une fonctionnalité spécifique à bash, qui montre que vous n'êtes pas intéressé par la compatibilité descendante. Ainsi, la correspondance des motifs change pour exclure .
et ..
de toutes les correspondances de motifs.
Le paramètre GLOBIGNORE=.
exclut un fichier qui est de toute façon automatiquement exclu chaque fois qu'il GLOBIGNORE
est défini, il est donc équivalent à shopt -s dotglob
sauf cela .
et ..
est en outre exclu de tous les modèles.
GLOBIGNORE
ignore uniquement.
et..
dans des modèles sans barre oblique et que GLOBIGNORE filtre les chemins de fichier et non les noms de fichier.GLOBIGNORE=.; echo .*
n'inclura pas.
ni..
, maisGLOBIGNORE=.; echo ./.*
(ouecho /bin/.*
) le fera! Pour ignorer.
et..
de tous les globes, il semble que vous ayez besoin deshopt -s extglob
etGLOBIGNORE='?(*/)@(.|..)'
.GLOBIGNORE='?(*/)@(.|..)'
ne parviendrait pas à exclure.
et..
à.*/foo
.GLOBIGNORE='?(*/)@(.|..)?(/*)'
briserait des globes comme./*
...Extrait de la section intitulée "Expansion du nom de chemin" dans
man bash
:la source