2016-11-21 2 views
2

J'essaie actuellement de reproduire les comportements de base de la coque, et plus spécifiquement les comportements de globulation. Je testais des commandes avec des accolades et j'ai trouvé ce comportement que je ne comprends pas. Tout d'abord, le contenu du répertoire où je travaille en est la suivante:Comment utiliser les accolades dans un shell (bash)

1abc 2abc 3abc abc1 abc2 abc3

Ensuite, je tapé la commande suivante: ls {[1-3],[a-c]}*, et il m'a retourné tous les fichiers ci-dessus comme prévu.

Enfin, j'ai essayé cette commande: ls {{,[1-3]},[a-c]}*, qui, comme vous pouvez le voir, a des accolades imbriquées. Maintenant, ce que je ne comprends pas est le retour de cette commande, car il m'a donné ceci: 1abc 1abc 2abc 2abc 3abc 3abc abc1 abc1 abc2 abc2 abc3 abc3

Comme vous pouvez le voir, tous les fichiers ont été retournés deux fois, et je ne peux pas comprendre comment le shell interprète ce.

J'espère que mon explication était claire.

Répondre

1

La chaîne {{,[1-3]},[a-c]}* est une expression interprétée comme brace expansion constitué par les motifs suivants:

  • "vide" ({,),
  • [1-3] et
  • [a-c].

Le caractère * (qui signifie « chaque nom de fichier dans le répertoire donné ») est appliqué pour chacun d'eux:

*  => 1abc 2abc 3abc abc1 abc2 abc3 
[1-3]* => 1abc 2abc 3abc 
[a-c]* => abc1 abc2 abc3 

Le fait que vous avez imbriqué les expressions ne change pas le sens qu'il est juste une liste des trois modèles. Le même effet pourrait être atteint avec une expression plus simple comme {,[1-3],[a-c]}*, ou une autre "liste de listes" comme {,{[1-3],[a-c]}}*.

Si vous passez l'expression à echo, il imprime tous les caractères des lignes ci-dessus, l'un après l'autre:

$ echo {{,[1-3]},[a-c]}* 
1abc 2abc 3abc abc1 abc2 abc3 1abc 2abc 3abc abc1 abc2 abc3 

Mais ls trie les entrées par ordre alphabétique par défaut:

$ ls {{,[1-3]},[a-c]}* 
1abc 1abc 2abc 2abc 3abc 3abc abc1 abc1 abc2 abc2 abc3 abc3 
+0

Ok , merci beaucoup pour cette explication, c'était vraiment clair et je le comprends maintenant! –

2

Bash développe

{{,[1-3]},[a-c]}* 

dans la première étape (entretoise d'expansion) pour

* [1-3]* [a-c]* 

Dans la deuxième étape (globbing) bash élargit * à tous les fichiers et[1-3]* à tous les fichiers commençant par 1, 2 ou 3et développe [a-c]* à tous les fichiers commençant par a, b ou c.