2016-04-12 13 views
3

私はファイルを1行ずつ読み込みます(正確には<(find /home/user/ -iname "*.MP4"))、各行について私はffmpegを実行するので、私はこのような何かやってる:ファイルを1行ずつ読むと、最初の行でffmpegを実行するだけです

while read -r line; do 
    ffmpeg -i "$line" [ MORE OPTIONS ... ] 
done < <(find /home/user/ -iname "*.MP4") 

ものの、何らかの理由で、のために最初の行のみがsuccessfuly処理されているが。

私のコードが他のすべての行を無視する理由は何ですか?

+0

'ffmpeg'ライン上のループ内の別の行を追加してみてください...'エコー処理:

  • ランダムプログラムによって使用されにくいFile Descriptorからread読み込みをしてみましょう$ line'である。あるいは、シバン行を '#!/ bin/bash-xv'に変更してみてください。 –

  • 答えて

    2

    これは、特別な動作がffmpeg(これはsshでも発生します)の原因で頻繁に発生する問題です。

    はほぼ正確にあなたのケースを処理するBash FAQ 89より引用:

    ここで何が起こっていますか?最初の例を見てみましょう。 readは標準入力(FD 0)から行を読み込み、それをファイルパラメータに置き、ffmpegが実行されます。 BASHから実行するプログラムのように、ffmpegは何らかの理由で標準入力を継承しています。どうしてか分かりません。しかし、ffmpegがstdinを読み込むと、はfindコマンドからすべての入力を吸い上げ、ループを飢えさせます

    TL; DR:

    は、次の2つの主要なオプションがあります:ffmpegの行の末尾に</dev/nullを追加

    • (すなわちffmpeg -i "$line" [ MORE OPTIONS ] ... </dev/null)問題を修正し、ffmpegを行います期待どおりに動作します。

      while IFS= read -r line <&3; do 
           # Here read is reading from FD 3, to which 'file' is redirected. 
          done 3<file 
      
    関連する問題