![Bash 脚本 ffmpeg 图片转视频不起作用但在命令行中起作用](https://linux22.com/image/722704/Bash%20%E8%84%9A%E6%9C%AC%20ffmpeg%20%E5%9B%BE%E7%89%87%E8%BD%AC%E8%A7%86%E9%A2%91%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%E4%BD%86%E5%9C%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%AD%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
这在命令行中用于将 jpg 序列转换为视频。
cat *.jpg | ffmpeg -f image2pipe -framerate 5 -i - -s 1280x720 ./HD720_out.mp4
但在包含以下内容的可执行脚本 temp.sh 中不起作用(第一个 jpg 除外):
eval cat "$1" | ffmpeg -f image2pipe -framerate 5 -i - -s 1280x720 "./HD720_out.mp4"
例如,./temp.sh *.jpg
只将第一个文件提供给视频,而不是序列。我做错了什么?命令行运行正常。
答案1
简化:$1
扩展为脚本的第一个命令行参数。
但是在脚本解释运行 temp.sh 的 shell 之前,它将首先扩展*中的星号./temp.sh *.jpg
,从而有效地在命令行中产生:
./temp.sh first.jpg second.jpg third.jpg
\
\_ $1
有两种方法可以解决这个问题。第一种方法(也是首选方法):
cat "$@" | ...
将只使用所有命令行参数,而不仅仅是第一个。您不需要eval
这个,也不应该使用它。
第二个(eval
发挥作用的地方):
eval cat "$1" |
在调用脚本时使用引用参数来避免扩展:
./temp.sh '*.jpg'