Bash 在读取行时从运行函数

Bash 在读取行时从运行函数,bash,function,loops,ffmpeg,while-loop,Bash,Function,Loops,Ffmpeg,While Loop,我试图在读取行时从运行一个函数,该函数包含对两个文件进行边缘化的ffmpeg命令。但由于某种原因,它运行的是第一个$line,然后从循环中断 “$filesList”包含三行。我不确定出了什么问题,但我可以用echo“$OFILE”确认,如果我注释掉ffmpeg命令,则opener函数运行三次,而使用ffmpeg命令只运行一次 opener(){ OFILE="$1" echo "$OFILE" ffmpeg -i $opener_path -c

我试图在读取行时从运行一个函数,该函数包含对两个文件进行边缘化的ffmpeg命令。但由于某种原因,它运行的是第一个
$line
,然后从循环中断

“$filesList”包含三行。我不确定出了什么问题,但我可以用echo“$OFILE”确认,如果我
注释掉
ffmpeg命令,则opener函数运行三次,而使用
ffmpeg命令只运行一次

opener(){
        OFILE="$1"
        echo "$OFILE"

        ffmpeg -i $opener_path -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
        ffmpeg -i $OFILE -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts
        ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc merge_$OFILE

        mv merge_$OFILE $OFILE
        rm intermediate1.ts intermediate2.ts
}


while read line; do
        if [ -e "$line" ]; then
                opener "$line"
        fi
done <<< "$filesList"
opener(){
OFILE=“$1”
回声“$OFILE”
ffmpeg-i$opener_path-c copy-bsf:v h264_mp4toanexb-f mpegts intermediate1.ts
ffmpeg-i$OFILE-c copy-bsf:v h264_mp4toanexb-f mpegts intermediate2.ts
ffmpeg-i“concat:intermediate1.ts | intermediate2.ts”-c copy-bsf:aac|u adtstoasc合并文件
mv合并文件$OFILE$OFILE
rm intermediate1.ts intermediate2.ts
}
读行时;做
如果[-e“$line”];然后
开场白“$line”
fi

完成似乎有一个
ffmpeg
命令正在从标准输入读取,在下一次调用
read
之前,该命令将消耗
$filesList
的其余内容。我不熟悉
ffmpeg
,但有两种可能:

  • -i
    是否需要参数?您发布的代码没有设置
    opener\u path
    的值,因此它的无引号扩展将生成一个空字符串,该字符串将被shell丢弃

  • ffmpeg
    如何解释concat:intermediate1.ts | intermediate2.ts
  • ?调用
    rm
    ,它似乎从未知源生成了一对文件


    似乎有一个
    ffmpeg
    命令正在从标准输入读取,这将在下次调用
    read
    之前消耗
    $filesList
    的其余内容。我不熟悉
    ffmpeg
    ,但有两种可能:

  • -i
    是否需要参数?您发布的代码没有设置
    opener\u path
    的值,因此它的无引号扩展将生成一个空字符串,该字符串将被shell丢弃

  • ffmpeg
    如何解释concat:intermediate1.ts | intermediate2.ts
  • ?调用
    rm
    ,它似乎从未知源生成了一对文件


    试着
    set-e
    和/或
    set-v
    看看到底发生了什么。@rici没有显示任何特别之处。一旦完成第一个循环,脚本就结束了,没有任何额外的命令。我倾向于同意@chepner。您是否仔细研究了ffmpeg命令行是如何进行参数扩展的?(您可以通过将
    opener“$line”
    更改为
    opener“$line”来检查@chepner的理论)@rici很有趣,现在它可以工作了!试着
    set-e
    和/或
    set-v
    看看到底发生了什么。@rici没有什么特别之处。它完成第一个循环后,脚本就结束了,没有任何额外的命令。我倾向于同意@chepner。你仔细看过ffmpeg命令行的参数扩展了吗?(您可以通过将
    opener“$line”
    更改为
    opener“$line”来检查@chepner的理论)@rici有趣,现在它工作了!
    $opener\u path
    不是100%为空,第一个文件合并出来。我不知道ffmpeg如何解释concat…我现在只知道它合并了intermediate1.ts和intermediate2.ts。你所说的
    似乎是从未知源生成一对文件
    ?我在中间文件上运行rm我以前是由ffmpegSorry创建的,没有滚动到足够远的地方来查看它们是由对
    ffmpeg
    的前两次调用生成的。这里解释:
    $opener\u path
    不是100%为空,第一个文件合并出来。我不知道ffmpeg是如何解释concat的…我现在只合并了intermediate1.ts和intermediate2.ts.您所说的
    似乎从未知源生成一对文件是什么意思?
    ?我在先前由ffmpegSorry创建的中间文件上运行rm,但没有滚动足够远,以查看它们是由对
    ffmpeg
    的前两次调用生成的。此处解释: