输入:
# cat list
video1.mp4
video2.mp4
video3.mp4
video4.mp4我的剧本:
#!/bin/bash
while IFS= read -r line || [[ -n "$line" ]]; do
echo $line
ffmpeg -i $line -c copy -bsf:v h264_mp4toannexb -f mpegts $line.ts
echo $line
done < "./list";
rm *.ts每隔一次迭代,bash就会读取"ideo2.mp4“而不是”instead 2.mp4“或"ideo4.mp4”而不是“instead 4.mp4”。
全输出
+ IFS=
+ read -r line
+ echo video1.mp4
video1.mp4
+ ffmpeg -i video1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts video1.mp4.ts
...
+ echo video1.mp4
video1.mp4
+ IFS=
+ read -r line
+ echo ideo2.mp4
ideo2.mp4
+ ffmpeg -i ideo2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts ideo2.mp4.ts
...
ideo2.mp4: No such file or directory
+ echo ideo2.mp4
ideo2.mp4
+ IFS=
+ read -r line
+ echo video3.mp4
video3.mp4
+ ffmpeg -i video3.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts video3.mp4.ts
...
+ echo video3.mp4
video3.mp4
+ IFS=
+ read -r line
+ echo ideo4.mp4
ideo4.mp4
+ ffmpeg -i ideo4.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts ideo4.mp4.ts
...
ideo4.mp4: No such file or directory
+ echo ideo4.mp4
ideo4.mp4当我评论“ffmpg.”一切都很好。
本地Ubuntu (bash 4.20(1)-release)和VPS (debian) (bash 4.12(1))的测试
怎么一回事?
发布于 2020-03-19 23:10:23
当我评论“ffmpg.”一切都很好。
您将./list的内容作为整个循环的标准输入传递,这意味着循环中的所有命令都可以从该标准输入中读取。
我从未使用过ffmpeg,但可能出于某种原因,它正在从标准输入中读取一个字节。如果将< /dev/null添加到ffmpeg命令(这样它就有自己的空标准输入而不是从ffmpeg继承),那么它将无法处理循环其余部分使用的标准输入。
顺便提一句,你的报价是错误的。没有必要引用./list (因为它没有特殊的字符或展开),相反,您应该在任何地方引用$line (因为添加引号更容易,并且在有展开时总是添加引号的习惯,而不是每次都证明在给定的情况下不需要引号)。所以:
ffmpeg -i "$line" -c copy -bsf:v h264_mp4toannexb -f mpegts "$line.ts" < /dev/nullhttps://stackoverflow.com/questions/60766097
复制相似问题