La sintaxis de expansión de llaves acepta comas, pero no acepta un espacio después de la coma. En muchos lenguajes de programación, los espacios después de las comas son comunes, pero no aquí. En Bash, la presencia de un espacio sin comillas evita que se realice la expansión de llaves.
Elimina el espacio y funcionará:
cp ~/some/dir/{my-file-to-rename.bin,new-name-of-file.bin}
Si bien no es obligatorio, tenga en cuenta que puede mover el final .binfuera de las llaves:
cp ~/some/dir/{my-file-to-rename,new-name-of-file}.bin
Si desea probar el efecto de la expansión de llaves, puede usar echoo printf '%s ', o printfcon la cadena de formato que prefiera, hacer eso. (Personalmente, solo lo uso echopara esto, cuando estoy en Bash, porque la función echointegrada de Bash no expande las secuencias de escape de forma predeterminada, y por lo tanto es razonablemente adecuado para verificar qué comando realmente se ejecutará). Por ejemplo:
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 ese espacio como lo haría con cualquier otro. Como IFS, el separador de campo interno. Esto se usa para la división de palabras después de la expansión y para dividir líneas en palabras con el comando de lectura incorporado.
Al insertar el delimitador, sin escape, le dijo a bash que su comando y argumentos son:
Si hubiera tenido citas o un escape "\", tendría:
Que tampoco sería lo que querías, a menos que "new-name-of-file.bin" sea el nuevo nombre de archivo que deseas. Espacio incluido. A medida que la expansión de la llave se realiza primero, y luego la expansión de tilde, bash se ejecutará:
Simplemente eliminar el espacio solucionaría todo eso.
fuente
cp ~/some/dir/{my-file-to-rename.bin, new-name-of-file.bin}yIFSafecta el resultado. Tampoco es así. Aquí, el espacio es un metacarácter en la tokenización ( paso 2 ). Ver 3.5.7 sobre cuándo ocurre la división. IntentaIFS=xentoncesprintf '[%s]\n' {a,b}printf '[%s]\n' {a, b}printf '[%s]\n' {a,xb}printf '[%s]\n' {a, xb}.