2015-01-26 225 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