处理“?”传递给ZSH函数的字符

时间:2016-02-24 17:34:47

标签: zsh zshrc zsh-alias

我在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的某种特殊字符。

2 个答案:

答案 0 :(得分:0)

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

例如,ls c?nfig会列出“config”和“cinfig”,只要它们存在。

所以,是的,你的问题只是zsh试图解释?在URL中作为与文件匹配的模式,无法找到任何文件,并且不知所措。逃避?用一个\或在它周围加上引号,就像你一样,修复它。

答案 1 :(得分:0)

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

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

unsetopt nomatch

手册页描述了此选项,如下所示(它描述了选项启用时会发生什么):

  

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

禁用选项再试一次:

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

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