내 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라는 세 개의 파일이 있습니다. 이들 모두는 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
.