为什么Shell脚本中的“读取”命令缺少初始字符?

时间:2019-04-15 04:14:37

标签: linux bash shell ubuntu ffmpeg

我有以下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

1 个答案:

答案 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,然后重新运行脚本。