Хотя это правда, что 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
безопасно, поскольку все его аргументы - это фиксированные строки, которые не содержат раскрытия параметров.