Посібник Баша говорить, що:
SIMPLE COMMAND EXPANSION
When a simple command is executed, the shell performs the following
expansions, assignments, and redirections, from left to right.
[...]
4. The text after the = in each variable assignment undergoes tilde
expansion, parameter expansion, command substitution, arithmetic
expansion, and quote removal before being assigned to the variable.
Розширення дужок немає в списку, тому воно не виконується для призначення v={a,b}-{1,2}
. Як згадує @Wildcard, просте розширення v=a-1 v=b-1 ...
все одно було б безглуздим.
Крім того, під час виконання echo $v
, застосовується таке:
EXPANSION
Expansion is performed on the command line after it has been split
into words. [...]
The order of expansions is: brace expansion; tilde expansion,
parameter and variable expansion, arithmetic expansion, and command
substitution (done in a left-to-right fashion); word splitting; and
pathname expansion.
Розгортання дужок відбувається перед змінним розширенням, тому дужки, призначені для $v
не, розширюються.
Але ви можете робити такі речі:
$ var_this=foo var_that=bar
$ echo $var_{this,that}
foo bar
Розширення з ним $(echo ...)
має спрацювати, якщо у вас немає пробілу в рядку, який потрібно розширити, і, отже, не виникне проблем з розщепленням слів. Кращим способом може бути використання змінної масиву, якщо ви можете.
наприклад, збережіть розширення в масив і запустіть якусь команду із розширеними значеннями:
$ v=( {a,b}-{1,2} )
$ some_command "${v[@]}"
=
. Наприклад,v=a-1 a-2
не вийде.