zsh 无法扩展 apt-get 正则表达式?

zsh 无法扩展 apt-get 正则表达式?

zsh 似乎无法扩展apt-get正则表达式。例如,我想安装所有带有前缀的包llvm-3.1,我使用:

sudo apt-get install llvm-3.1*

但是 zsh 告诉我:

zsh: no matches found: llvm-3.1*

zsh 很好地扩展了其他正则表达式(ls *总是列出all当前目录中不隐藏的文件)。

我也尝试过bash甚至sh(实际上是dash),它们都运行正常。

那么我需要设置一些额外的选项来适用于 apt-get 吗?提前致谢。

答案1

这些模式不是正则表达式,它们通常被称为 glob 模式。在任何情况下,shell 都不会正确扩展用于 apt-get 的软件包名称的 glob 模式。shell 只会根据本地文件系统上存在的文件扩展 glob 模式。

您使用过的其他 shell 也无法扩展该模式,但它们不会报告错误,而是将输入的参数传递给 apt-get,然后 apt-get 能够匹配模式本身并根据可用软件包的名称执行此操作。您可以使用以下命令从 zsh 获得该行为:

unsetopt no_match

但是,最好习惯于引用特殊字符,例如*当您不希望 shell 扩展这些模式时。如果在运行该命令时,您当前目录中恰好有一个与该模式匹配的文件,则任何 shell 都会在运行 apt-get 之前扩展该模式以匹配该文件,这不太可能产生您期望的结果。

以下任何一项都可以在任何这些 shell 中工作,即使您拥有与该模式匹配的文件:

sudo apt-get install llvm-3.1\*
sudo apt-get install 'llvm-3.1*'
sudo apt-get install "llvm-3.1*"

这将阻止 shell 尝试错误地扩展模式,而对于 zsh,如果模式无法扩展,它将避免出现错误消息。

相关内容