【发布时间】:2020-07-01 02:45:03
【问题描述】:
输入:
# 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”而不是“video2.mp4”或“ideo4.mp4”而不是“video4.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.4.20(1)-release) 和 VPS (debian) (bash 4.4.12(1)) 上进行测试
怎么回事?
【问题讨论】:
-
我怀疑文件有 CRLF 行结尾,用
dos2unix修复它 -
仅在 Linux 上工作。通过 nano 创建的文件
-
将
set -x放在脚本的开头,这样您就可以看到所有正在执行的语句,并扩展了变量。 -
试试这个:
for line in $(< ./list); do [[ -n "$line" ]] || continue; echo $line; ffmpeg -i $line -c copy -bsf:v h264_mp4toannexb -f mpegts $line.ts; echo $line; done不完美但应该可以测试ffmpeg吃stdin的理论。