必须在引号中传递网址

必须在引号中传递网址

我正在尝试传递一个 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

这将解决您原来的用例。一般来说,最好用特殊字符引用参数,以避免出现任何错误,即文件恰好存在且具有相应的名称,或者当您认为它存在时它并不存在。

相关内容