Estou tentando copiar um arquivo para um nome diferente no mesmo diretório usando a expansão de chaves. Estou usando o bash 4.4.18.
Aqui está o que eu fiz:
cp ~/some/dir/{my-file-to-rename.bin, new-name-of-file.bin}
mas recebo este erro:
cp: cannot stat '/home/xyz/some/dir/{my-file-to-rename.bin,': No such file or directory
Mesmo uma simples expansão de colchetes como esta me dá o mesmo erro:
cp {my-file-to-rename.bin, new-name-of-file.bin}
O que estou fazendo errado?
A sintaxe de expansão de colchetes aceita vírgulas, mas não aceita 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 que a expansão da chave seja executada.
Remova o espaço e funcionará:
Embora não seja necessário, observe que você pode mover o rastro
.bin
para fora das chaves:Se quiser testar o efeito da expansão de colchetes, você pode usar
echo
ouprintf '%s '
, ouprintf
com qualquer string de formato de sua preferência, para fazer isso. (Pessoalmente, eu apenas usoecho
para isso, quando estou no Bash, porque o built -in do Bashecho
não expande as sequências de escape por padrão e, portanto, é razoavelmente adequado para verificar qual comando será realmente executado.) Por exemplo:string{foo, bar}
não é expansão de contraventamento; são as duas palavrasstring{foo,
ebar}
. Para usar a expansão de colchetes, os colchetes precisam estar dentro da mesma palavra. Você terá que remover o espaço extra se não precisar dele ou citá-lo se precisar:O Bash trata esse espaço como faria com qualquer outro. Como IFS, o separador de campo interno. Isso é usado para divisão de palavras após a expansão e para dividir linhas em palavras com o comando interno de leitura.
Ao inserir o delimitador, sem escape, você disse ao bash que seu comando e argumentos são:
Se você tivesse aspas ou um escape "\", você teria:
O que também não seria o que você queria, a menos que "novo-nome-do-arquivo.bin" seja o novo nome de arquivo que você queria. Espaço incluído. Como a expansão da chave acontece primeiro e, em seguida, a expansão do til, o bash executaria:
Simplesmente remover o espaço resolveria tudo isso.