Execute command multiple times with curly brackets arguments list Execute command multiple times with curly brackets arguments list bash bash

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.