スクリプトからHandBrakeCLIを呼び出すと、ループが中断されます。

スクリプトからHandBrakeCLIを呼び出すと、ループが中断されます。

私のbashスクリプトには、次のようにwhileループがあります。私が理解していないのは、HandBrakeCLI呼び出しがループを中断する理由です。 「if」条件がfalseで「else」の後に来ると、ループは続行されます。これは私のスクリプトです。

FILES="xxx*.ts
yyy.ts"

for f in $FILES
do
  find /pathto -name $f -print | while IFS= read -r file; do
    echo "file found = $file"
    outputfile=$outputpath$(basename "$file")".mp4"

    if [[ ! -f $outputfile ]] then 
      HandBrakeCLI -i "$file" -o "$outputfile" -e x264 -q 22 -r 15 -B 64 -X 480 -O
    else echo "outputfile already exists: $outputfile"
    fi
  done
done

したがって、xxx​​1.ts、xxx2.ts、yyy.tsという3つのファイルがあります。これらはすべてHandBrakeCLIで見つけて変換する必要があります。ただし、最初の変換(xxx1.ts)の後、whileループは中断され、yyy.tsを処理します。スクリプトを再起動すると、最初のファイルが変換されたことを確認してelseブランチに移動します。今回はwhileループが中断されることなくxxx2.tsを処理し、次にyyy.tsを処理します。

HandBrakeCLI 呼び出しによってループが中断されるのはなぜですか?これが起こらないようにする方法は?

ベストアンサー1

whileHandBrakeCLI標準入力はプロセス間で共有されるため、標準入力も消費される可能性があるため、作成された内容は安全に使用できません。これは最小限の例で見ることができます。

$ printf "a\nb\nc\n" \
| while IFS= read -r x; do echo $x; sed 's/$/ sed was here/'; done
a
b sed was here
c sed was here

whileしたがって、落書き後は標準入力から読み取ることができないため、ループは早く終了します。sed

回避策は、コードの他のどれも他のファイル記述子を使用したくないことです。3

while IFS= read -u 3 -r x; do
  echo $x
  sed 's/$/ sed read this line/'
done 3< <(printf "a\nb\nc\n")

または、他のプログラミング言語に切り替えてください。 (sed標準入力を入力しないと停止します。)

別のオプションは、プログラムの標準入力をオフにすることです。

HandBrakeCLI ... <&-

これは、ループに必要な標準入力を見ることができないためですwhile

おすすめ記事