Bash

為什麼這個 ffmpeg 命令在 bash 而不是 zsh 中工作?

  • April 12, 2016

今天我下班回家(在 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?

Whilezsh將報告沒有設置選項的模式匹配錯誤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 *
*

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