apt-get * 通配符与 ZSH

mir*_*lol 18 apt zsh

ZSH:

sudo apt-get remove --purge ubuntuone-* 
ERROR: zsh: no matches found: ubuntuone-*
Run Code Online (Sandbox Code Playgroud)

适用于 Bash。有什么问题 ?:-D

Dav*_*due 18

是的,zsh并且bash在这方面表现不同。

在 中zsh,当您说“ ubuntuone-*”时,它会在您当前的工作目录中查找以ubuntuone--开头的文件- 因为它没有找到任何文件,所以它会说“ no matches”并且不运行该命令。

bash采取不同的策略 - 它还查找以ubuntuone-当前工作目录开头的文件,但如果找不到任何文件,它会对自己说,“也许我正在调用的程序知道如何处理通配符,”然后就通过了“ ubuntuone-*" off tosudo apt-get作为字面参数。

如果当前工作目录中有一个名为 的文件ubuntuone-ffdjhjer,那么 bash 会尝试执行sudo apt-get remove --purge ubuntuone-ffdjhjer,这可能会失败。

zsh( 和 in bash) 中,您可以使用单引号告诉它不要扩展通配符而是传递它,如下所示:

sudo apt-get remove --purge 'ubuntuone-*'
Run Code Online (Sandbox Code Playgroud)

  • 我可以让 zsh 以那种方式表现得像 Bash 一样吗? (2认同)

小智 11

这个答案可能有点晚了,但有办法解决这个问题。从命令行执行:

unsetopt no_match
Run Code Online (Sandbox Code Playgroud)

  • 或者使用 `bash` 中的 `shopt -s failureglob` 来_修复_`bash`,这样它的行为就像 `zsh` 和其他现代 shell,如 `fish` 或 `tcsh`,它们修复了 Bourne shell 的错误功能,因此命令可能仍然是即使 glob 不匹配也要运行。 (3认同)

小智 6

还有另一种方法可以防止 zsh 中的扩展,我更喜欢这种方法而不是引号:

sudo apt-get remove --purge ubuntuone-\*
Run Code Online (Sandbox Code Playgroud)