2015-01-26 140 views
0

我运行下面的bash脚本转动我的手机西元Bash while循环无故停止?

while read filename ; do 
    nf=$(echo $filename |rev | cut -f1 -d '/'|cut -f2- -d '.' |rev) 
    echo $nf 
    rm -f ffmpeg2pass-0.log 
    rm -f rotate/tmp.avi 
    ffmpeg -i $filename -c:v libxvid -pass 1 -c:a libmp3lame -qscale:a 4 -vf "transpose=2,transpose=2" "rotate/tmp.avi" 
    ffmpeg -i $filename -c:v libxvid -pass 2 -c:a libmp3lame -qscale:a 4 -vf "transpose=2,transpose=2" "rotate/$nf.avi" 
done <rotatelist_2 

我知道有更好的方法来做到这一点;我一起评论这一点,但我搞清楚如何做视频,所以其余的不需要看起来不错;-))

然而,第一次运行后,循环意外结束,没有错误信息。我运行类似的循环来处理其他非常好的工作。

回声没有被再次调用,所以我猜这个循环本身有问题。列表中的换行符是0x0A,所以它应该没问题。

+0

'rotatelist_2'的内容是什么? – Wintermute 2015-01-26 21:54:01

+2

循环内的任何命令是否也读取标准输入?如果是这样,它会吃剩下的'rotatelist_2'。看起来它必须是'ffmpeg',所以我不会评价它的可能性。你可以使用'while read -u 3 filename;做...;完成3 2015-01-26 21:59:00

+0

那个丑陋的第二行可以用'basename'替换。这假设文件扩展名总是相同的,如果不是,就像'$ {x%。*}'会做的那样(详细信息在* bash手册页中删除匹配的后缀模式*。) – Marian 2015-01-26 22:11:18

回答

2

使用

</dev/null ffmpeg ... 
</dev/null ffmpeg ... 

ffmpeg ... </dev/null 
ffmpeg ... </dev/null 

,以防止通过的ffmpeg从标准输入读取rotatelist_2。

+0

另一种方法是从文件重定向(然后读取)除标准输入以外的FD。 – 2015-01-26 22:05:44

+0

是的,Jonathan Leffler的解决方案更聪明。 – Cyrus 2015-01-26 22:10:05

+0

赛勒斯,多数民众赞成。谢谢 – 2015-01-27 05:57:57