A sintaxe de expansão do colchete aceita vírgulas, mas não aceita um espaço após a vírgula. Em muitas linguagens de programação, espaços após vírgulas são comuns, mas não aqui. No Bash, a presença de um espaço sem aspas impede a execução da expansão de chaves.
Remova o espaço e ele funcionará:
cp ~/some/dir/{my-file-to-rename.bin,new-name-of-file.bin}
Embora não seja de todo necessário, observe que você pode mover a trilha para .bin
fora dos aparelhos:
cp ~/some/dir/{my-file-to-rename,new-name-of-file}.bin
Se você quiser testar o efeito da expansão entre chaves, poderá usar isso echo
ou printf '%s '
, ou printf
com a sequência de formatos que preferir. (Pessoalmente, eu apenas uso echo
isso quando estou no Bash, porque o echo
built-in do Bash não expande as seqüências de escape por padrão e, portanto, é razoavelmente adequado para verificar qual comando realmente será executado.) Por exemplo:
ek@Io:~$ echo cp ~/some/dir/{my-file-to-rename,new-name-of-file}.bin
cp /home/ek/some/dir/my-file-to-rename.bin /home/ek/some/dir/new-name-of-file.bin
Bash trata esse espaço como qualquer outro. Como IFS, o separador de campo interno. Isso é usado para dividir palavras após a expansão e para dividir linhas em palavras com o comando read builtin.
Ao inserir o delimitador, sem escape, você disse ao bash que seu comando e argumentos são:
Se você tivesse aspas ou uma fuga "\", teria:
O que também não seria o que você queria, a menos que "new-name-of-file.bin" seja o novo nome de arquivo desejado. Espaço incluído. À medida que a expansão do braquete acontece primeiro, e depois a expansão do til, o bash executa:
Simplesmente remover o espaço consertaria tudo isso.
fonte
cp ~/some/dir/{my-file-to-rename.bin, new-name-of-file.bin}
eIFS
afeta o resultado. Nem é assim. Aqui, o espaço é um metacaractere na tokenização ( etapa 2 ). Veja 3.5.7 quando a divisão acontece. TenteIFS=x
entãoprintf '[%s]\n' {a,b}
printf '[%s]\n' {a, b}
printf '[%s]\n' {a,xb}
printf '[%s]\n' {a, xb}
.