Si bien es cierto que eval
siempre se debe abordar con precaución, la eval echo
construcción no siempre es inútil y se puede usar de manera segura. Recientemente lo necesitaba para evaluar múltiples expansiones de llaves en el orden en que las necesitaba.
bash
realiza expansiones de llaves múltiples de izquierda a derecha, entonces
xargs -I_ cat _/{11..15}/{8..5}.jpg
se expande a
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
pero necesitaba la segunda expansión de llaves primero, produciendo
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
Lo mejor que se me ocurrió hacer fue
xargs -I_ cat $(eval echo _/'{11..15}'/{8..5}.jpg)
Esto funciona porque las comillas simples protegen el primer conjunto de llaves de la expansión durante el análisis de la eval
línea de comando, dejándolos expandidos por la subshell invocada por eval
.
Puede haber algún esquema astuto que implique expansiones de llaves anidadas que permita que esto suceda en un solo paso, pero si es así, soy demasiado viejo y estúpido para verlo. También hay otros depósitos bash
que permiten formas más ordenadas de lograr este tipo de cosas. Pero, en cualquier caso, este uso de eval
es seguro porque sus argumentos son cadenas fijas que no contienen expansiones de parámetros.