Хоча це правда, що 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
є безпечним, оскільки його аргументи - це всі фіксовані рядки, що не містять розширень параметрів.