2010-04-25 2 views
4

다양한 크기의 .mkvs를 ipod/iphone 크기의 .mp4s로 자르기/크기 조정하는 일괄 변환 스크립트가 있습니다. 원래 크기, 필요한 자르기, 출력 파일을 결정하면 모두 정상적으로 작동합니다. 그러나 첫 번째 변환이 성공적으로 완료되면 HandbrakeCLI는 상위 스크립트를 종료합니다. 왜 이럴 수 있니? 어떻게 멈출 수 있습니까?하위 프로세스 (HandbrakeCLI)가 상위 스크립트가 종료되지 않도록 방지

코드, 그것은 현재의 약자로 :

#!/bin/bash 
find . -name "*.mkv" | while read FILE 
do 
    # What would the output file be? 
    DST=../Touch/$(dirname "$FILE") 
    MKV=$(basename "$FILE") 
    MP4=${MKV%%.mkv}.mp4 

    # If it already exists, don't overwrite it 
    if [ -e "$DST/$MP4" ] 
    then 
     echo "NOT overwriting $DST/$MP4" 
    else 

     # Stuff to determine dimensions/cropping removed for brevity 

     HandbrakeCLI --preset "iPhone & iPod Touch" --vb 900 --crop $crop -i "$FILE" -o "$DST/$MP4" > /dev/null 2>&1 

     if [ $? != 0 ] 
     then 
      echo "$FILE had problems" >> errors.log 
     fi 
    fi 
done 

내가 추가로 트랩을 시도했지만 (마지막 트랩 화재 했더라도) 그

trap "echo Handbrake SIGINT-d" SIGINT 
trap "echo Handbrake SIGTERM-d" SIGTERM 
trap "echo Handbrake EXIT-d" EXIT 
trap "echo Handbrake 0-d"  0 
을 동작을 변경하지 않았다

덧붙여 편집 :

'0'함정이 발사되어 그 이유를 조사하게되었습니다. bash -x $script으로 실행하면 find | while read 루프가 너무 일찍 끝나는 것으로 나타났습니다.

나는 find와 encode를 별도의 스크립트로 재구성했다. 이제 찾기 루프가 있습니다 :

find . -name "*.mkv" | while read FILE 
do 
    handbrake-touch "$FILE" 

    if [ $? != 0 ] 
    then 
     echo "$FILE had problems" >> errors.log 
    fi 
done 

동작은 동일하고 하나의 인코딩 다음에 while 루프가 끝납니다. 'handbrake-touch'대신 'echo $ FILE'을 넣으면 모든 파일이 나열됩니다. 현재 디렉토리가 변경되지 않습니다 (무엇이 find | while을 손상 시킬지 궁금합니다).

+0

유행을 켜고 출구가 정확히 어디에서 일어나는지 확인하기 위해 유행의 끝에'-x'를 추가하십시오. –

답변

6

this 다른 스레드의 단서 덕분에 해결되었습니다.

find . -name "*.mkv" | while read FILE 
do 
    echo "" | handbrake-touch "$FILE" 

    if [ $? != 0 ] 
    then 
     echo "$FILE had problems" >> errors.log 
    fi 
done 

을 ... 의도 한대로 그것은/예상 작품 : 지금 내 스크립트와 같은 표준 입력을 사용하지 않는 것 확인하기 위해 HandbrakeCLI에 아무런 반향이 없습니다.

관련 문제