今天我下班回家(在 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
选项集: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 处理?
和其他模式按字面匹配特殊字符的方法。
zsh
还提供noglob
内置函数,它可以为以下简单命令禁用文件名生成:
$ noglob echo *
*