ZSH的Apt-get *通配符


15

ZSH:

sudo apt-get remove --purge ubuntuone-* 
ERROR: zsh: no matches found: ubuntuone-*

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

Answers:


13

是的,zshbash不同的表现在这方面。

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

bash采取另一种方法-它还会ubuntuone-在当前工作目录中查找以该文件开头的文件,但如果找不到,它会对自己说:“也许我正在调用的程序知道如何处理通配符,因此通过” ubuntuone-*“关于sudo apt-get作为文字说法。

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

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

sudo apt-get remove --purge 'ubuntuone-*'

2
我可以使zsh以这种方式表现为Bash吗?
mirandalol

我不知道,但是到目前为止我所做的少量研究表明没有。无论如何,如果您不希望shell扩展通配符,最好用单引号将参数括起来(即使是在bash中),因为即使在bash中,如果CWD中的文件,该命令也不会执行您想要的操作匹配通配符。例如,我总是输入dpkg -l 'linux*'bash来查看所有已安装的内核。
David Purdue

10

这个答案可能会晚一点,但是有一种解决方法。从命令行执行:

unsetopt no_match

这很好用
neaumusic

shopt -s failglobbash修复 bash这样它像zsh等现代炮弹喜欢fish或者tcsh 是有固定的Bourne shell的,由此即使水珠不匹配的命令仍然可能运行的不良特性。
斯特凡Chazelas

@StéphaneChazelasyoda
OpenCoderX

1

还有另一种方法可以防止zsh扩展,我更喜欢用引号:

sudo apt-get remove --purge ubuntuone-\*
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.