シェルスクリプトのループ処理でffmpegを実行する際は"</dev/null"が必要だった

WSL2+Ubuntu+Z shell(zsh)+ffmpeg(4.2.4)環境です。

以下まるまる

bash と ffmpeg でハマった話

と同じ話なのですが、解決には非常に時間がかかりました。

やりたいことは

  • 複数の動画ファイルのパスを記述したテキストファイルを作成

  • シェルスクリプトで上記のテキストファイルを読み込み、ループしながらffmpegで動画ファイルを変換

で、実行してみると

  • テキストファイルの1行目に記述されている動画ファイルは変換される

  • 2行目以降は数行スキップされ、テキストファイル中に指定した一部動画しか変換されない

という挙動です。

上記リンク先に答えが出ていますが

cat テキストファイル | while read line || [[ -n "${line}" ]]
do
    ffmpeg パラメータ
done

ではなく、ffmpegに"< /dev/null"とリダイレクトすること

cat テキストファイル | while read line || [[ -n "${line}" ]]
do
    ffmpeg パラメータ < /dev/null
done

で正しく動きました。

数々のトライアンドエラー、数時間どころじゃなくドブに捨ててしまった…。

余談ですが、本記事のタイトルに"</dev/null"を使用したところ、</dev/null以降の文字列が消えてしまいました(2021/06/30現在)。暫定対応として<(半角)を<(全角)にしておきます。


*2021/07/22追記

ループでreadしながらsshを実行する場合も-nオプションの指定 = "</dev/null"が必要だそうです。

またreadではなくforを使うという解決策もあるそうです。

【了】

この記事が気に入ったらサポートをしてみませんか?