Хоча це правда, що evalдо цього завжди потрібно підходити обережно, eval echoбудівництво не завжди є безглуздим і його можна використовувати безпечно. Нещодавно мені це було потрібно, щоб отримати декілька розширень підтяжок в оцінці в тому порядку, в якому я їх потребував.
bash робить кілька розширень дужок зліва направо, так
xargs -I_ cat _/{11..15}/{8..5}.jpg
розширюється до
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
але мені було потрібно друге розширення дужок, зроблене першим, поступаючись
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
Найкраще, що я міг придумати, щоб це зробити
xargs -I_ cat $(eval echo _/'{11..15}'/{8..5}.jpg)
Це працює, тому що одиничні лапки захищають перший набір дужок від розширення під час розбору evalкомандного рядка, залишаючи їх розширювати за допомогою підпрограми, на яку посилається eval.
Можливо, існує якась хитра схема, що включає вкладені розширення дужок, що дозволяє це статися за один крок, але якщо є я занадто старий і дурний, щоб це бачити. Є й інші снаряди, окрім bashяких дозволяють охайніші способи досягнення подібного роду. Але у будь-якому випадку це використання evalє безпечним, оскільки його аргументи - це всі фіксовані рядки, що не містять розширень параметрів.