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,如果模式无法扩展,它将避免出现错误消息。