终端命令中的问号是什么意思?

Ook*_*ker 11 command-line apt bash

这个问题(How can I remove gnome from a kubuntu 12.04 install?)有带问号的命令:

sudo apt-get remove --purge ubuntu-desktop
sudo apt-get remove --purge unity?
sudo apt-get remove --purge gnome?
Run Code Online (Sandbox Code Playgroud)

他们的意思是什么?

Mal*_*ppa 17

一般来说,在 Bash 中, a?是一个 glob 模式,可以扩展为任意字符。

例如:

$ echo Hello1 > foo1
$ echo Hello2 > foo2
$ cat foo?
Hello1
Hello2
Run Code Online (Sandbox Code Playgroud)

它类似于 a *,但 a*扩展为0 个或多个字符,而 a?扩展为恰好一个(任意)字符。

但是,在您的特殊情况下,?命令中的 显然是一个错字。


小智 15

这些被称为通配符(通配模式)

各种命令行实用程序使用标准通配符(也称为通配符模式)来处理多个文件。
几乎所有命令(包括 mv、cp、rm 和许多其他命令)都使用标准通配符。

  • (question mark)

    这可以表示任何单个字符。如果您在命令行中指定了诸如“hd?”之类的内容?GNU/Linux 会查找 hda、hdb、hdc 以及 az、0-9 之间的所有其他字母/数字。

  • *(asterisk)

    这可以表示任意数量的字符(包括零,换言之,零个或多个字符)。如果您指定了“cd*”,它将使用“cda”、“cdrom”、“cdrecord”以及以“cd”开头的任何内容,也包括“cd”本身。“m*l”可以是mill、mull、ml,以及任何以m开头并以l结尾的东西。

  • [ ] (square brackets)

    指定一个范围。如果你做了 m[a,o,u]m 它可以变成:mam、mum、mom 如果你做了:m[ad]m 它可以变成任何以 m 开头和结尾并且中间有任何字符 a 到 d 的东西。例如,这些将起作用:mam、mbm、mcm、mdm。这种通配符指定了“或”关系(您只需要匹配一个)。

  • { } (curly brackets)

    术语用逗号分隔,每个术语必须是某物的名称或通配符。此通配符将复制与通配符或确切名称(“或”关系,一个或另一个)匹配的任何内容。


例如,这将是有效的:

  • cp { .doc, .pdf} ~

    这会将任何以 .doc 或 .pdf 结尾的内容复制到用户主目录。请注意,逗号(或其他任何地方)后不允许有空格。

  • [!]

    此构造类似于 [ ] 构造,不同之处在于它不匹配括号内的任何字符,而是匹配任何字符,只要它不在 [ 和 ] 之间列出。这是一个逻辑非。例如 rm myfile[!9] 将删除所有 myfiles*(即 myfiles1、myfiles2 等),但不会删除名称中任何位置为 9 的文件。

  • \ (backslash)

    用作“转义”字符,即保护后续特殊字符。因此,“\”搜索反斜杠。注意您可能需要使用引号和反斜杠。

更多示例:访问此页面

  • `几乎所有命令(包括 mv、cp、rm 和许多其他命令)都使用标准通配符。` => FALSE。这些通配符正在被 shell 扩展,命令接收的是扩展的结果(即匹配模式的文件)而不是模式。(如果没有任何文件与模式匹配,那么该模式将直接传递给命令) (4认同)
  • 值得一提的是,`apt-get remove` 需要 _package_ 名称,而不是文件名,这使得 shell 的通配符扩展在很大程度上无用。如果您想删除一系列包,您需要使用完整的正则表达式,适当地引用以防止 shell 尝试将其解释为 glob(例如,`apt-get remove 'gnome.*'`)。 (3认同)