S'il est vrai que cela eval
doit toujours être abordé avec prudence, la eval echo
construction n'est pas toujours inutile et peut être utilisée en toute sécurité. J'en avais récemment besoin pour faire évaluer plusieurs extensions d'accolade dans l'ordre où je les avais fait.
bash
fait plusieurs expansions d'accolade de gauche à droite, donc
xargs -I_ cat _/{11..15}/{8..5}.jpg
s'étend à
xargs -I_ cat _/11/8.jpg _/11/7.jpg _/11/6.jpg _/11/5.jpg _/12/8.jpg _/12/7.jpg _/12/6.jpg _/12/5.jpg _/13/8.jpg _/13/7.jpg _/13/6.jpg _/13/5.jpg _/14/8.jpg _/14/7.jpg _/14/6.jpg _/14/5.jpg _/15/8.jpg _/15/7.jpg _/15/6.jpg _/15/5.jpg
mais j'avais besoin que la deuxième extension de l'orthèse soit faite en premier, donnant
xargs -I_ cat _/11/8.jpg _/12/8.jpg _/13/8.jpg _/14/8.jpg _/15/8.jpg _/11/7.jpg _/12/7.jpg _/13/7.jpg _/14/7.jpg _/15/7.jpg _/11/6.jpg _/12/6.jpg _/13/6.jpg _/14/6.jpg _/15/6.jpg _/11/5.jpg _/12/5.jpg _/13/5.jpg _/14/5.jpg _/15/5.jpg
Le mieux que j'ai pu faire pour le faire était
xargs -I_ cat $(eval echo _/'{11..15}'/{8..5}.jpg)
Cela fonctionne parce que les guillemets simples protègent le premier ensemble d'accolades de l'expansion pendant l'analyse de la eval
ligne de commande, les laissant être développés par le sous-shell invoqué par eval
.
Il peut y avoir un schéma astucieux impliquant des extensions d'accolades imbriquées qui permet que cela se produise en une seule étape, mais s'il y en a, je suis trop vieux et stupide pour le voir. Il y a aussi des coquilles autres que celles bash
qui permettent des façons plus ordonnées de réaliser ce genre de chose. Mais dans tous les cas, cette utilisation de eval
est sûre car ses arguments sont tous des chaînes fixes qui ne contiennent aucune extension de paramètre.