3

我在 ZSH 中设置简单函数时遇到问题。

我想制作只从 youtube 下载 mp3 文件的功能。

我使用了 youtube-dl,我想做一个简单的函数来让我更容易

ytmp3(){
  youtube-dl -x --audio-format mp3 "$@"}

所以当我尝试

ytmp3 https://www.youtube.com/watch?v=_DiEbmg3lU8

我明白了

zsh: no matches found: https://www.youtube.com/watch?v=_DiEbmg3lU8

但如果我尝试

ytmp3 "https://www.youtube.com/watch?v=_DiEbmg3lU8"

有用。如果我在之后删除所有字符,我发现程序运行(但不会下载任何内容)?包括它。所以我猜这是zsh的某种特殊字符。

4

2 回答 2

3

默认情况下,ZSH 将尝试“glob”您在命令行上使用的模式(它会尝试将模式与文件名匹配)。如果它不能匹配,你会得到你得到的错误(“找不到匹配”)。

您可以通过禁用以下nomatch选项来禁用此行为:

unsetopt nomatch

手册页对此选项的描述如下(它描述了启用该选项时会发生什么):

如果用于文件名生成的模式没有匹配项,则打印错误,而不是在参数列表中保持不变。

禁用该选项后重试:

$ unsetopt nomatch
$ ytmp3 https://www.youtube.com/watch?v=_DiEbmg3lU8

如果要永久禁用该选项,可以将 disable 命令添加到~/.zshrc文件中。

于 2017-03-08T18:59:24.920 回答
1

问号是 ZSH 模式匹配的一部分,类似于 *. 它的意思是“任何字符”。

例如,ls c?nfig将列出“config”和“cinfig”,前提是它们存在。

所以,是的,你的问题只是 zsh 试图解释 ? 在 URL 中作为与文件匹配的模式,找不到任何文件,然后就崩溃了。逃脱?用 \ 或在它周围加上引号,就像你做的那样,来修复它。

于 2016-03-06T04:34:26.437 回答