Расширение скобок: выполнить несколько команд вместо расширения на одной строке?


11

Когда вы используете расширение скобок в Bash, что-то вроде

echo {a,b,c}

становится

echo a b c

Есть ли способ расширить его до 3 отдельных команд, по одной для каждого расширения, вместо этого?

И что:

echo {a,b,c}

станет

echo a
echo b
echo c

Ответы:


12

Это просто вопрос «потому что я хочу знать», или есть реальный вариант его использования? Мы могли бы пройти некоторую гимнастику, чтобы сделать это:

$ eval echo\ {a,b,c}\;
a
b
c

Но я бы охотился на любого, кто вставлял такие запутывающие команды в наши системные скрипты.

Почему бы не пойти на ясность вместо этого:

$ for X in {a,b,c}; do echo $X; done

Вы могли бы даже пойти напролом, вставить пару новых строк и сделать небольшой отступ, чтобы вы всегда могли понять, что вы пытаетесь сделать.


4
@ Пет - я предполагаю, что это упрощенный пример. Если это действительно так просто, как список, то вы правы. Если это что-то более похожее, file-{r,b,g}{m,n,o}{x,y.z}.fooто лучше использовать краткую форму, чем перечислять все 27 значений.
unpythonic

@Peth - Я думал, что это хороший вопрос для продолжения.
unpythonic

я давно хотел это знать, спасибо! :)
Sirex

1
Ну, в данном случае использовались программы, которые не принимают более одного файла (например), поэтому расширение не будет работать. Поэтому было бы хорошо иметь возможность легко запускать программу несколько раз. В forработах для этого, но это еще более типирование: P
houbysoft

Я использовал его для очистки нескольких веток git:eval git branch -d \{ branch-a, branch-b }\;
Kit

3

Основываясь на выбранном ответе Марка Манна , я смог получить следующий пример, который прекрасно работает:

$ eval echo\ category_{17,32,33}.properties\{,.bak\}\;
category_17.properties category_17.properties.bak
category_32.properties category_32.properties.bak
category_33.properties category_33.properties.bak

Это показывает, что когда вы используете множественные вхождения фигурных скобок в пределах строки, оригинальный пример Марка напечатал бы каждый вариант отдельно. Вместо этого я хотел использовать его ответ для перемещения / переименования нескольких файлов. Для того, чтобы гарантировать , что выходной сигнал соответствует формату , который mvобычно ожидает ( mv oldfilename newfilename), я избегал второго вхождения расширения распорки, так что она не будет оценена , пока после того, как начальное evalкомандование выполняется.

Поскольку вышеприведенный вывод выглядел, как и ожидалось, я смог выполнить следующую команду:

$ eval mv\ category_{17,32,33}.properties\{,.bak\}\;
$ ls
category_17.properties.bak  category_32.properties.bak  category_33.properties.bak

Большое спасибо Марку за его оригинальный ответ. Пожалуйста, проголосуйте за его ответ, если вам нравится, что его ответ позволил мне сделать :-)


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.