Выполнить команду несколько раз с помощью списка аргументов в фигурных скобках

когда мне нужно было запустить команду несколько раз с другим аргументом, я использовал этот подход (не понимая его полностью):

touch {a,b,c}

что эквивалентно:

touch a
touch b
touch c

Я думаю, что то же самое может быть достигнуто со следующим циклом:

for file in {a,b,c}; do touch $file; done
я наткнулся на случай, когда это не работает:
pear channel-discover {"pear.phpunit.de","pear.symfony-project.com"}

у меня есть несколько вопросов:

  1. как называется то, что происходит в первый пример и что именно происходит?
  2. лучше ли использовать этот подход для простых вещей, а не для циклов for-in?
  3. почему команда pear не работает так? Должен ли командный скрипт реализовать некоторые методы для обработки таких аргументов или это оболочка отвечает за это?

3 ответов


это называется Фигурные Скобки, который расширяется до списка данных строк, разделенного пробелом.

так touch {a,b,c} было бы эквивалентно

touch a b c

пока touch {a,b,c}x было бы эквивалентно:

touch ax bx cx

вы pear команда по существу будет выполняться как:

pear channel-discover pear.phpunit.de pear.symfony-project.com

что может быть не то, что вы ожидали. Если вы хотите, чтобы команда выполнялась один раз для каждой строки, используйте цикл for (который отвечает на ваш 2-й вопрос) или используйте сочетание расширения скобки и xargs.


проблема в том, что вопреки вашим ожиданиям,фигурные скобки of

touch {a,b,c}

эквивалентно

touch a b c   # NOT 3 separate invocations.

(использовать echo {a,b,c} чтобы проверить). Оказывается, что pear channel-discover не принимаются два args. Вероятно, вы увидите ту же ошибку с

pear channel-discover pear.phpunit.de pear.symfony-project.com

Ну, у вас есть два варианта:

for i in "pear.phpunit.de" "pear.symfony-project.com"
do
  pear channel-discover "$i"
done

или однострочный (но вызывающий xargs вместо использования bash internals):

echo "pear.phpunit.de" "pear.symfony-project.com" | xargs -n1 pear channel-discover

первый, безусловно, легче читать человеком, эффективность времени будет в основном то же самое.