删除名称中包含 `(` 字符的文件时出现语法错误

af1*_*345 5 command-line

我正在尝试使用带有此命令的控制台删除文件

rm ./google-chrome-stable_current_amd64(1).deb
Run Code Online (Sandbox Code Playgroud)

但我收到语法错误。这个命令有什么问题?

Eli*_*gan 5

括号由外壳特别处理。引用它们以删除它们的特殊含义,以便外壳按字面意思对待它们。

有三种主要的引用形式,为此目的,它们中的任何一种都可以:

  • 由于()不是'字符,因此它们在单引号内按字面意思处理(只要单引号本身没有被引用)。
  • 由于它们不是$, `, \, 或!,所以它们在双引号内按字面意思处理(只要双引号本身没有被引用)。
  • 像任何字符一样,它们在 a 之后按\字面意思处理(只要反斜杠本身没有被引用)。

因此,以下任何一项都将起作用:

rm ./google-chrome-stable_current_amd64\(1\).deb  # backslashes
Run Code Online (Sandbox Code Playgroud)
rm './google-chrome-stable_current_amd64(1).deb'  # single quotes
Run Code Online (Sandbox Code Playgroud)
rm "./google-chrome-stable_current_amd64(1).deb"  # double quotes
Run Code Online (Sandbox Code Playgroud)

虽然不太常用,但您也可以使用单引号或双引号来引用小于完整参数的内容。例如,这些也有效:

rm ./google-chrome-stable_current_amd64'(1)'.deb
Run Code Online (Sandbox Code Playgroud)
rm ./google-chrome-stable_current_amd64"(1)".deb
Run Code Online (Sandbox Code Playgroud)

另外,请注意,./此处不需要路径中的前导,但可以包含它。使用rm,只有当路径以-字符开头时才需要它,这rm会尝试将其视为一个或多个选项而不是路径。(尽管您也可以--在路径之前传递一个单独的参数,以指示所有单独的参数都是路径而不是选项。)