Embora seja verdade que eval
sempre precisa ser abordado com cautela, a eval echo
construçã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 eval
linha 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 bash
que 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.