Выполнить команду несколько раз с помощью списка аргументов в фигурных скобках
когда мне нужно было запустить команду несколько раз с другим аргументом, я использовал этот подход (не понимая его полностью):
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"}
у меня есть несколько вопросов:
- как называется то, что происходит в первый пример и что именно происходит?
- лучше ли использовать этот подход для простых вещей, а не для циклов for-in?
- почему команда 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
первый, безусловно, легче читать человеком, эффективность времени будет в основном то же самое.