Shell
必須在引號中傳遞 url
我正在嘗試將 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
這將解決您的原始案例。不過,一般來說,最好用特殊字元引用參數,以避免在文件碰巧存在具有相應名稱的文件或您認為文件不存在時出現任何錯誤。