我正在尝试使用大括号扩展将文件以不同的名称复制到同一目录中。我正在使用 bash 4.4.18。
这是我所做的:
cp ~/some/dir/{my-file-to-rename.bin, new-name-of-file.bin}
但我收到此错误:
cp: cannot stat '/home/xyz/some/dir/{my-file-to-rename.bin,': No such file or directory
即使是像这样的简单大括号扩展也会给我同样的错误:
cp {my-file-to-rename.bin, new-name-of-file.bin}
我究竟做错了什么?
大括号扩展语法接受逗号,但不接受逗号后的空格。在许多编程语言中,逗号后的空格很常见,但这里不是。在 Bash 中,不带引号的空格的存在会阻止执行大括号扩展。
删除空间,它将起作用:
虽然根本不需要,但请注意,您可以将尾随移动到
.bin
大括号之外:如果您想测试大括号扩展的效果,您可以使用
echo
orprintf '%s '
或printf
您喜欢的任何格式字符串来执行此操作。echo
(当我在 Bash 中时,我个人只是使用它,因为Bash 的echo
内置默认情况下不会扩展转义序列,因此非常适合检查实际运行的命令。)例如:string{foo, bar}
不是大括号扩展;这是两个词string{foo,
和bar}
。要使用大括号扩展,大括号必须在同一个单词内。如果不需要,则必须删除多余的空间,如果确实需要,则必须引用它:Bash 像对待任何其他空间一样对待该空间。作为 IFS,内部场分离器。这用于扩展后的分词,并使用 read 内置命令将行拆分为单词。
通过插入分隔符,未转义,然后您告诉 bash 您的命令和参数是:
如果您有引号或转义“\”,您将:
这也不是您想要的,除非“new-name-of-file.bin”是您想要的新文件名。包括空间。由于大括号扩展首先发生,然后是波浪号扩展,bash 将执行:
只需删除空间即可解决所有问题。