The ekspansi brace sintaks menerima koma, tetapi tidak menerima spasi setelah koma. Dalam banyak bahasa pemrograman, spasi setelah koma adalah hal biasa, tetapi tidak di sini. Di Bash, keberadaan ruang tanpa tanda kutip mencegah ekspansi brace dilakukan.
Hapus ruang, dan itu akan berhasil:
cp ~/some/dir/{my-file-to-rename.bin,new-name-of-file.bin}
Meskipun sama sekali tidak diperlukan, perhatikan bahwa Anda dapat memindahkan trailing di .bin
luar kawat gigi:
cp ~/some/dir/{my-file-to-rename,new-name-of-file}.bin
Jika Anda ingin menguji efek ekspansi brace, Anda dapat menggunakan echo
atau printf '%s '
, atau printf
dengan format string apa pun yang Anda inginkan, untuk melakukannya. (Secara pribadi saya hanya menggunakan echo
untuk ini, ketika saya berada di Bash, karena Bash's echo
builtin tidak memperluas urutan escape secara default, dan dengan demikian cukup cocok untuk memeriksa perintah apa yang sebenarnya akan berjalan.) Misalnya:
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 memperlakukan ruang itu seperti yang lainnya. Sebagai IFS, Pemisah Bidang Internal. Ini digunakan untuk pemisahan kata setelah ekspansi dan untuk memecah baris menjadi kata-kata dengan perintah read builtin.
Dengan memasukkan pembatas, tidak terhapus, maka Anda memberi tahu bash perintah dan argumen Anda adalah:
Seandainya Anda memiliki kutipan atau pelarian "\", Anda akan memiliki:
Yang juga tidak akan seperti yang Anda inginkan, kecuali "new-name-of-file.bin" adalah nama file baru yang Anda inginkan. Termasuk ruang. Saat ekspansi brace terjadi terlebih dahulu, dan kemudian ekspansi tilde, bash akan mengeksekusi:
Hanya dengan menghapus ruang akan memperbaiki semua itu.
sumber
cp ~/some/dir/{my-file-to-rename.bin, new-name-of-file.bin}
danIFS
mempengaruhi hasilnya. Tidak juga begitu. Di sini, ruang adalah metacharacter dalam tokenization ( langkah 2 ). Lihat 3.5.7 tentang kapan pemisahan terjadi. CobalahIFS=x
kemudianprintf '[%s]\n' {a,b}
printf '[%s]\n' {a, b}
printf '[%s]\n' {a,xb}
printf '[%s]\n' {a, xb}
.