为什么这个 ffmpeg 命令在 bash 中有效,而在 zsh 中无效?

为什么这个 ffmpeg 命令在 bash 中有效,而在 zsh 中无效?

今天我下班回家(在 Ubuntu 机器上运行 bash)并尝试使用我心爱的 zsh 在本地 arch 机器上运行一些代码,但命令失败了?

下面的命令明显改变了个人信息和ip

ffmpeg -i rtsp://user:[email protected]: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:[email protected]:5554/my-media/media.amp?videocodec=h264

为什么我心爱的 zsh 背叛了我?

答案1

在字符串中:

rtsp://user:[email protected]:5554/my-media/media.amp?videocodec=h264

你已经?在该字符串中,所以 shell 将执行路径名扩展在该字符串上,使用模式匹配规则。

在 中bash,如果failglob未设置选项(默认情况下),则失败的模式将保持原样:

$ echo does-not-exist?
does-not-exist?

虽然将报告选项集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选项集:nomatchfailglob

$ shopt -s failglob
$ echo does-not-exist?
bash: no match: does-not-exist?

更一般地说,您可以禁用 shell 文件名生成:

$ set -f
$ : "The command"
$ set +f

(或者set -o noglobset +o noglob

或使用外壳之一引用使 shell 处理?和其他模式按字面匹配特殊字符的方法。


zsh还提供noglob内置函数,它可以为以下简单命令禁用文件名生成:

$ noglob echo *
*

相关内容