Mentre è vero che eval
deve sempre essere affrontato con cautela, la eval echo
costruzione non è sempre inutile e può essere utilizzata in modo sicuro. Di recente ne avevo bisogno per valutare più espansioni di parentesi graffe nell'ordine in cui ne avevo bisogno.
bash
fa più espansioni di parentesi graffe da sinistra a destra, quindi
xargs -I_ cat _/{11..15}/{8..5}.jpg
si espande 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
ma avevo bisogno che la seconda espansione della parentesi graffa venisse eseguita per prima, cedendo
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
Il meglio che ho potuto inventarmi è stato
xargs -I_ cat $(eval echo _/'{11..15}'/{8..5}.jpg)
Questo funziona perché le virgolette singole proteggono il primo set di parentesi graffe dall'espansione durante l'analisi della eval
riga di comando, lasciandole espandere dalla subshell invocata da eval
.
Potrebbe esserci qualche astuzia che prevede espansioni di parentesi graffe annidate che consente che ciò avvenga in un solo passaggio, ma se c'è sono troppo vecchio e stupido per vederlo. Ci sono anche conchiglie diverse da quelle bash
che consentono modi più ordinati per raggiungere questo tipo di cose. Ma in ogni caso, questo uso di eval
è sicuro perché i suoi argomenti sono tutte stringhe fisse che non contengono espansioni di parametri.