Embora seja verdade que evalsempre precisa ser abordado com cautela, a eval echoconstrução nem sempre é inútil e pode ser usada com segurança. Recentemente, eu precisava dele para obter várias expansões de chaves avaliadas na ordem em que eu precisava.
bash faz várias expansões de braçadeira da esquerda para a direita,
xargs -I_ cat _/{11..15}/{8..5}.jpg
expande para
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
mas eu precisava da segunda expansão de braçadeira feita primeiro, produzindo
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
O melhor que eu pude fazer para isso foi
xargs -I_ cat $(eval echo _/'{11..15}'/{8..5}.jpg)
Isso funciona porque as aspas simples protegem o primeiro conjunto de chaves da expansão durante a análise da evallinha de comando, deixando-as serem expandidas pelo subshell invocado por eval.
Pode haver algum esquema astuto envolvendo expansões de chaves aninhadas que permita que isso aconteça em uma única etapa, mas se houver, sou velho e estúpido demais para vê-lo. Também existem outras conchas bashque permitem maneiras mais organizadas de alcançar esse tipo de coisa. Mas, em qualquer caso, esse uso de evalé seguro porque seus argumentos são todos cadeias fixas que não contêm expansões de parâmetro.