我有以下shell脚本,除了第一行外,其他各行都缺少一些初始字符(到目前为止,我错过了最初的几个字符)。
这仅在我使用ffmpeg
命令时发生。否则就可以了。但是此命令可以执行此脚本中的实际任务。
为什么会这样,解决方法是什么?
#!/bin/bash
while read line; do
printf "%s\n" "$line"
ifile=$line
printf "%s\n" "$ifile"
ofile=abc_$line
printf "%s\n" "$ofile"
############### Problem is the following command: ##########
ffmpeg -y -i $ifile -c:v libx264rgb -b:v 512k -bf 0 -pix_fmt rgb24 -r 25 -strict -2 $ofile
##########rest is fine##########
echo $ifile
done < file_list
答案 0 :(得分:2)
在这篇帖子I'm reading a file line by line and running ssh or ffmpeg, only the first line gets processed!中对此进行了很好的解释。逐行读取文件时,如果循环内的命令也读取stdin,则可能耗尽输入文件。就您而言,ffmpeg
也会从stdin中读取。
最常见的症状是while读取循环仅运行一次,即使输入包含很多行。这是因为其余的行被有问题的命令吞没了。解决此问题的最常见方法是通过执行ffmpeg
< /dev/null
的标准输入
ffmpeg -y -i "$ifile" -c:v libx264rgb -b:v 512k -bf 0 -pix_fmt rgb24 -r 25 -strict -2 "$ofile" < /dev/null
或使用标准输入以外的其他文件描述符
while read -r line <&3; do
ifile="$line"
ofile="abc_${line}"
ffmpeg -y -i "$ifile" -c:v libx264rgb -b:v 512k -bf 0 -pix_fmt rgb24 -r 25 -strict -2 "$ofile"
done 3<file
或者您的问题可能完全是输入文件具有从DOS环境继承来的DOS样式行结尾的情况。您可以通过在可能显示file
的输入文件(file file_list
)上运行CRLF line terminators
命令来进行检查。在这种情况下,请清除输入文件dos2unix file_list
,然后重新运行脚本。