私の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
したがって、xxx1.ts、xxx2.ts、yyy.tsという3つのファイルがあります。これらはすべてHandBrakeCLIで見つけて変換する必要があります。ただし、最初の変換(xxx1.ts)の後、whileループは中断され、yyy.tsを処理します。スクリプトを再起動すると、最初のファイルが変換されたことを確認してelseブランチに移動します。今回はwhileループが中断されることなくxxx2.tsを処理し、次にyyy.tsを処理します。
HandBrakeCLI 呼び出しによってループが中断されるのはなぜですか?これが起こらないようにする方法は?
答え1
while
HandBrakeCLI
標準入力はプロセス間で共有されるため、標準入力も消費される可能性があるため、作成された内容は安全に使用できません。これは最小限の例で見ることができます。
$ 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
。