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 .bin
fuera 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 echo
o printf '%s '
, o printf
con la cadena de formato que prefiera, hacer eso. (Personalmente, solo lo uso echo
para esto, cuando estoy en Bash, porque la función echo
integrada 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}
yIFS
afecta 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=x
entoncesprintf '[%s]\n' {a,b}
printf '[%s]\n' {a, b}
printf '[%s]\n' {a,xb}
printf '[%s]\n' {a, xb}
.