Execute command multiple times with curly brackets arguments list
That's called Brace Expansion, which expands to a space-separated list of the given strings.
So touch {a,b,c}
would be equivalent to
touch a b c
While touch {a,b,c}x
would be equivalent to:
touch ax bx cx
You pear
command would essentially be run as:
pear channel-discover pear.phpunit.de pear.symfony-project.com
which may not be what you expected. If you want the command to be run once for each string, use a for loop (which answers your 2nd question), or use a combination of brace expansion and xargs.
The problem is that contrary to your expectation, the brace expansion of
touch {a,b,c}
is equivalent to
touch a b c # NOT 3 separate invocations.
(Use echo {a,b,c}
to verify). It appears that pear channel-discover
does not accept two args. You will probably see the same error with
pear channel-discover pear.phpunit.de pear.symfony-project.com
Well, you have two options:
for i in "pear.phpunit.de" "pear.symfony-project.com"do pear channel-discover "$i"done
Or a one-liner (but calling xargs
instead of using bash internals):
echo "pear.phpunit.de" "pear.symfony-project.com" | xargs -n1 pear channel-discover
The former is certainly easier to read by the human, the time efficiency will be basically the same.