Shell

必須在引號中傳遞 url

  • July 18, 2014

我正在嘗試將 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將參數視為字元串?

我假設您在這裡無意中刪除了命令行的重要部分:有問題的 URL 包含一個?字元(或 a *)。?並且*是與 shell 匹配的特殊 glob 字元。?匹配文件名中的單個字元,並*匹配多個字元。什麼時候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

這將解決您的原始案例。不過,一般來說,最好用特殊字元引用參數,以避免在文件碰巧存在具有相應名稱的文件或您認為文件不存在時出現任何錯誤。

引用自:https://unix.stackexchange.com/questions/145214