Фигурные скобки синтаксис принимает запятые, но он не принимает пробел после запятой. Во многих языках программирования пробелы после запятой являются обычным явлением, но не здесь. В Bash наличие пробела без кавычек не позволяет выполнить расширение скобок.
Уберите пробел, и он будет работать:
cp ~/some/dir/{my-file-to-rename.bin,new-name-of-file.bin}
Хотя это и не требуется, обратите внимание, что вы можете переместить трейлинг .bin
за скобки:
cp ~/some/dir/{my-file-to-rename,new-name-of-file}.bin
Если вы хотите проверить эффект расширения скобок, вы можете использовать echo
или printf '%s '
, или printf
с любой строкой формата, которую вы предпочитаете, чтобы сделать это. (Лично я просто использую echo
для этого, когда нахожусь в Bash, потому что echo
встроенная функция Bash по умолчанию не расширяет escape-последовательности и, таким образом, достаточно хорошо подходит для проверки того, какая команда на самом деле будет выполняться.) Например:
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
Баш относится к этому пространству так же, как к любому другому. Как IFS, внутренний разделитель полей. Это используется для разделения слов после раскрытия и разделения строк на слова с помощью встроенной команды read.
Вставив разделитель unescaped, вы сказали bash, что ваша команда и аргументы:
Если бы у вас были кавычки или побег "\", вы бы получили:
Что также не будет тем, что вы хотели, если только «new-name-of-file.bin» не является новым именем файла, которое вы хотели. Пространство включено. Поскольку сначала происходит расширение скобок, а затем расширение тильды, bash выполнит:
Простое удаление пробела исправит все это.
источник
cp ~/some/dir/{my-file-to-rename.bin, new-name-of-file.bin}
иIFS
влияет на результат. Ни то, ни другое. Здесь пространство является метасимволом в токенизации ( шаг 2 ). См. 3.5.7 о том, когда происходит разделение. ПопробуйIFS=x
тогдаprintf '[%s]\n' {a,b}
printf '[%s]\n' {a, b}
printf '[%s]\n' {a,xb}
printf '[%s]\n' {a, xb}
.