Dans Bash, les extensions génériques sont-elles garanties?

54

L’expansion d’un caractère générique dans Bash est-elle garantie dans l’ordre alphabétique? Je suis obligé de scinder un fichier volumineux en fichiers de 10 Mo afin qu'ils puissent être acceptés par mon référentiel Mercurial.

Alors je pensais que je pourrais utiliser:

split -b 10485760 Big.file BigFilePiece.

puis à la place de:

cat BigFile | bigFileProcessor

Je pourrais faire:

cat BigFilePiece.* | bigFileProcessor

à sa place.

Cependant, je ne pouvais trouver aucun endroit qui garantisse que l'extension de l'astérisque (aka wildcard, aka *) serait toujours dans l'ordre alphabétique, comme cela a .aaété le cas auparavant .ab(par opposition à un ordre d'horodatage ou quelque chose du genre).

Aussi, y a-t-il des défauts dans mon plan? Quel est le coût de la performance catdu fichier ensemble?

Traîneau
la source
4
Bien sûr, vous prenez la mauvaise approche. Si l’administrateur limite la taille des fichiers que vous avez dans le référentiel, vous devriez lui parler. En parlant d’expansion - j’ai toujours vu que l’agrandissement était alphanumérique.
Mircea Vutcovici
1
Vous pouvez toujours vous y diriger sortsi vous avez besoin d'une manipulation de commande supplémentaire.
Warner
2
Veuillez noter que Mercurial peut gérer des fichiers de toute taille, limités par la quantité de RAM dont vous disposez. Vous recevez un avertissement si vous ajoutez un fichier volumineux, car Mercurial suppose qu'il peut conserver le fichier en mémoire. Pour les fusions, Mercurial doit conserver deux fichiers en mémoire. Les ordinateurs disposant de peu de RAM risquent donc d'avoir du mal à extraire le fichier. Je viens de le tester, et hg commitsur un Nfichier Mo, il faut environ 3 3 * NMo de RAM et hg updateenviron 2 2 * NMo de RAM. Ceci est avec Mercurial 1.5 sur Linux.
Martin Geisler

Réponses:

67

Oui, l'expansion globale est alphabétique.

De la manpage Bash :

Expansion du chemin

Après la séparation de mots, à moins que l' -foption a été activée, le bash recherche dans chaque mot les caractères *, ?et [. Si l'un de ces caractères apparaît, le mot est considéré comme un motif et remplacé par une liste triée par ordre alphabétique de noms de fichiers correspondant au motif.

Dennis Williamson
la source
@ Dennis Williamson, Avez-vous une idée de ce que cela resterait si un utilisateur utilisait un autre langage?
Zoredache
5
@Zoredache: C'est ce qui est spécifié par POSIX: opengroup.org/onlinepubs/007908775/xsh/glob.html "Les chemins d'accès sont dans l'ordre de tri défini par le paramètre actuel de la catégorie LC_COLLATE, voir la spécification XBD, LC_COLLATE [ opengroup.org / onlinepubs / 007908775 / xbd /… "et c'est pourquoi vous devriez faire des choses comme à la ls -l [[:lower:]]place de ls -l [a-z].
Dennis Williamson
Notez que l'ordre est alphabétique, donc BigFilePiece.10 passera avant BigFilePiece.2
Ken
@DennisWilliamson - Pourquoi deux paires de crochets? On semble fonctionner exactement la même chose pour moi.
ArtOfWarfare
2
@ArtOfWarfare: Essayez ceci: mkdir lctest; cd lctest; touch w; touch z; ls -l [:lower:]; echo =====; ls -l [[:lower:]]. Le fichier "z" est uniquement répertorié à la seconde lscar il demande des noms de fichier minuscules à une lettre. La première ls- celle sans crochets - demande des noms de fichier à un caractère dans la liste de caractères ":", "l", "o", "w", "e" et "r". Dans les deux cas, les crochets les plus externes délimitent une expression entre crochets qui répertorie les caractères et les classes. Dans le cas de [[:lower:]], les crochets intérieurs, les deux points et le mot désignent une classe de caractères. ...
Dennis Williamson
4

C'est un comportement documenté pour bashque vous puissiez en dépendre dans vos scripts. C’est également le cas pour d’autres coques compatibles Bourne depuis très longtemps ... bien qu’il puisse exister des cas délicats en ce qui concerne le pliage des cas ou les caractères non alphanumériques.

(La liste résultante bashsera dans un ordre presque "ASCII-bétique" - sauf que les lettres minuscules et majuscules seront assemblées comme s'il n'y avait pas de différences majuscules mais que les minuscules étaient rassemblées avant leurs équivalents majuscules. -les alphabètes doivent être regroupés dans le même ordre d'apparition qu'en ASCII).

Comme d'autres l'ont fait remarquer, cela pourrait être perturbé par les paramètres de votre environnement linguistique: LANG en général et LC_COLLATE plus spécifiquement. Il est peut-être plus sage d’exécuter des commandes qui dépendent d’une envcommande d’ expansion globale dans le cadre d’une commande visant à vider l’environnement (à l’aide de -iou -uselon le cas) ou à diriger les résultats sortpour garantir un séquençage robuste.

Jim Dennis
la source
4
Il semble que tous les éléments non alphanumériques sont ignorés lors du processus de tri. Donc "=", "_", "~" ne peuvent pas être utilisés pour forcer un fichier à commencer ou à terminer (respectivement) la liste.
Otheus
3

Bien que les développements globaux soient triés par ordre alphabétique, ils obéissent également aux paramètres de langage du shell.

Assurez-vous de définir ceci sur "C" dans votre script si vous souhaitez que cela soit portable.

adaptr
la source