Розширення дужки: виконати кілька команд замість того, щоб розширюватись на одному рядку?


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
@peth - Я припускаю, що це спрощений приклад. Якщо це дійсно так просто, як список, то ви маєте рацію. Якщо це щось на кшталт, file-{r,b,g}{m,n,o}{x,y.z}.fooтоді краще використовувати коротку форму, ніж перераховувати всі 27 значень.
непітонічний

@peth - Я подумав, що це гарне подальше запитання.
непітонічний

я хотів це знати давно, дякую! :)
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.