处理&引用;传递给ZSH函数的字符

处理&引用;传递给ZSH函数的字符,zsh,zshrc,zsh-alias,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=_D

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

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

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


所以,是的,你的问题很简单,zsh试图解释?在URL中作为与文件匹配的模式,找不到任何文件,并将其删除。逃走?与您一样,使用\或在其周围加引号来修复它。

默认情况下,ZSH将尝试在命令行上使用“全局”模式(它将尝试将模式与文件名匹配)。如果它不能匹配,则会出现错误(“未找到匹配项”)

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

unsetopt nomatch
手册页面对该选项的描述如下(它描述了启用该选项时发生的情况):

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

请在禁用选项的情况下重试:

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

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

我找到了一种方法,我制作了一个打开bash shell解释器的脚本,并将整个链接解析到该解释器中。这是一种链接的bash函数。谢谢你的回答!(我无法投票表决我的代表过低)