Quando você executa for i in b{e,\ }s ; do echo $i ; done
, a expansão de chave b{e,\ }s
é expandida em dois argumentos, um é bes
e outro é b s
, portanto, o loop for
tem dois valores para iterar. Observe que aqui b s
é um único argumento.
Por outro lado, em for i in bes b s ; do echo $i ; done
, você está mencionando explicitamente três argumentos para iterar (separados por espaços), ou seja, bes
, b
e s
.
No terceiro caso, a substituição de comando $(echo b{e,\ }s)
gerará três argumentos bes
, b
e s
, então, novamente, o loop for
tem três valores para iterar exatamente como no segundo caso.