Bash
為什麼這個 ffmpeg 命令在 bash 而不是 zsh 中工作?
今天我下班回家(在 Ubuntu 機器上執行 bash)並嘗試用我心愛的 zsh 在我的本地 Arch 機器上執行一些程式碼,但命令失敗了?
該命令在下面,個人資訊和 ip 明顯改變
ffmpeg -i rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264 -threads 3 -vcodec copy -f segment -segment_time 2 outfiles/cam_out%04d.mp4
它在 bash 中執行完美,但是當我在 zsh 中執行它時出現錯誤
zsh: no matches found: rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264
為什麼我心愛的zsh背叛了我?
在字元串中:
rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264
你
?
在那個字元串中,所以 shell 將使用模式匹配規則對該字元串執行路徑名擴展。在
bash
中,如果failglob
未設置選項(預設設置),則失敗的模式將保持原樣:$ echo does-not-exist? does-not-exist?
While
zsh
將報告沒有設置選項的模式匹配錯誤nomatch
,這是預設設置:$ echo does-not-exist? zsh: no matches found: does-not-exist?
您可以
zsh
抑制錯誤並列印模式:$ setopt nonomatch $ echo does-not-exist? does-not-exist?
您可以通過打開來使
bash
行為zsh
與選項集類似:nomatch``failglob
$ shopt -s failglob $ echo does-not-exist? bash: no match: does-not-exist?
更一般地說,您可以禁用 shell 文件名生成:
$ set -f $ : "The command" $ set +f
(或
set -o noglob
,set +o noglob
)或使用其中一種 shell引用方法來使 shell 處理
?
和其他模式匹配特殊字元。
zsh
還提供noglob
內置函式,它可以為以下簡單命令禁用任何單詞的文件名生成:$ noglob echo * *