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

2540
houbysoft

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

echo 

становится

echo a b c 

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

Чтобы:

echo 

станет

echo a echo b echo c 
11

3 ответа на вопрос

12
unpythonic

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

$ eval echo\ \; a b c 

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

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

$ for X in ; do echo $X; done 

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

@peth - I'm assuming this is a simplified example. If it is indeed as simple as a list, then you're right. If it's something more like `file-.foo` then it's better to use the short form than enumerating all 27 value. unpythonic 12 лет назад 4
@Peth - Я думал, что это хороший вопрос для продолжения. unpythonic 12 лет назад 0
я давно хотел это знать, спасибо! :) Sirex 12 лет назад 0
Ну, в данном случае использовались программы, которые не принимают более одного файла (например), поэтому расширение не будет работать. Поэтому было бы хорошо иметь возможность легко запускать программу несколько раз. `For` работает для этого, но он все еще больше печатает: P houbysoft 12 лет назад 1
Я использовал его для очистки нескольких веток git: `eval git branch -d \ \; ` Kit 6 лет назад 0
3
Jon L.

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

$ eval echo\ category_.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_.properties\{,.bak\}\; $ ls category_17.properties.bak category_32.properties.bak category_33.properties.bak 

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

0
tae
printf '%s\n' echo{\ a,\ b,\ c} 
eval echo {\ a \;, \ b \;, \ c \;} Brian Vandenberg 12 лет назад 0

Похожие вопросы