我正在尝试传递一个 URL 以mpv
使其作为网络流播放。
bash
这可以通过以下语法完成:
$ mpv http://myvideosite.com
但是,zsh
想要将 URL 评估为(大概)文件路径。跑步
% mpv http://myvideosite.com
得到以下响应:
zsh: no matches found: http://myvideosite.com
返回码为 1。
跑步
% mpv "http://myvideosite.com"
按预期执行。
不zsh
将参数视为字符串?
答案1
我假设您无意中删除了命令行的重要部分:相关 URL 包含一个?
字符(或*
)。?
和*
是 shell 的特殊全局匹配字符。?
匹配文件名中的单个字符,并*
匹配多个字符。当zsh
说:
zsh: no matches found: http://myvideosite.com?video=123
http://myvideosite.com?video=123
它告诉您当前目录中没有可访问的文件。
在 zsh 中,默认情况下,像这样的失败扩展是一个错误,但在 Bash 中不是:失败的模式仅作为参数保留,与编写时完全相同。 zsh 的行为更安全,因为您不能编写一个因为文件丢失而秘密地不执行您的意思的命令,但是如果您愿意,您可以将其更改为具有 Bash 行为:
setopt nonomatch
这NOMATCH
选项默认打开,并导致您看到的错误。如果您禁用它,setopt nonomatch
那么任何失败的全局扩展都将在命令行上保持不变:
$ echo foo?bar
zsh: no matches found: foo?bar
$ setopt nonomatch
$ echo foo?bar
foo?bar
这将解决您原来的用例。一般来说,最好用特殊字符引用参数,以避免出现任何错误,即文件恰好存在且具有相应的名称,或者当您认为它存在时它并不存在。