处理“?”传递给 ZSH 函数的字符
Handling "?" character passed to ZSH function
我在 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模式匹配的一部分,类似于*。意思是"Any character".
例如,ls c?nfig
将同时列出 "config" 和 "cinfig",前提是它们存在。
所以,是的,您的问题只是 zsh 试图解释 ?在 URL 中作为与文件匹配的模式,找不到任何文件,然后崩溃。逃脱?用 \ 或者像你一样在它周围加上引号来修复它。
默认情况下,ZSH 将尝试 "glob" 您在命令行上使用的模式(它将尝试将模式与文件名匹配)。如果它不能匹配,你会得到你得到的错误 ("no matches found").
您可以通过禁用 nomatch
选项来禁用此行为:
unsetopt nomatch
手册页对这个选项的描述如下(它描述了当该选项被启用时会发生什么):
If a pattern for filename generation has no matches, print an error, instead of leaving it unchanged in the argument list.
禁用选项后重试:
$ unsetopt nomatch
$ ytmp3 https://www.youtube.com/watch?v=_DiEbmg3lU8
如果您想永久禁用该选项,可以将禁用命令添加到您的 ~/.zshrc
文件中。
我在 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模式匹配的一部分,类似于*。意思是"Any character".
例如,ls c?nfig
将同时列出 "config" 和 "cinfig",前提是它们存在。
所以,是的,您的问题只是 zsh 试图解释 ?在 URL 中作为与文件匹配的模式,找不到任何文件,然后崩溃。逃脱?用 \ 或者像你一样在它周围加上引号来修复它。
默认情况下,ZSH 将尝试 "glob" 您在命令行上使用的模式(它将尝试将模式与文件名匹配)。如果它不能匹配,你会得到你得到的错误 ("no matches found").
您可以通过禁用 nomatch
选项来禁用此行为:
unsetopt nomatch
手册页对这个选项的描述如下(它描述了当该选项被启用时会发生什么):
If a pattern for filename generation has no matches, print an error, instead of leaving it unchanged in the argument list.
禁用选项后重试:
$ unsetopt nomatch
$ ytmp3 https://www.youtube.com/watch?v=_DiEbmg3lU8
如果您想永久禁用该选项,可以将禁用命令添加到您的 ~/.zshrc
文件中。