genisoimage가 성공했는지 확인

genisoimage가 성공했는지 확인

나는 모든 VIDEO_TS 디렉토리를 .ISO로 변환하는 스크립트를 사용합니다. genisoimage가 실패하고 다음 폴더를 변환하는 대신 실제로 변환하고 있는지 어떻게 확인할 수 있습니까?

변환 후 폴더를 삭제하라는 명령이 있지만 genisoimage가 실패하면 여전히 삭제됩니다.

#!/bin/bash
iso_name=""
parent_path=""
full_path=""
total=0

IFS=$'\n'
clear

for file in $(find /shares/media/ -type d -name 'VIDEO_TS')
do

parent_path="$(dirname -- "$file")"
full_path="$file"
iso_name="$(basename -- "$parent_path").ISO"
iso_path=""$(dirname -- "$parent_path")"/"$iso_name""

echo "Converting to "$iso_name""

((total++))
genisoimage -allow-limited-size -o  "$iso_path" -dvd-video "$parent_path"
rm -rf "$parent_path" 

done

echo "Succesfully converted "$total" videos to ISO!"

답변1

모든 프로세스에는종료 상태0에서 255 사이의 숫자입니다. 0은 성공을 나타내고 다른 모든 것은 실패를 나타내는 거의 보편적으로 따르는 규칙이 있습니다1.

쉘 스크립트에서 특수 변수에는 $?마지막 명령의 종료 상태가 포함됩니다. 두 번 이상 사용해야 하는 경우 다른 변수에 저장하십시오(그렇지 않으면 이를 사용하는 첫 번째 명령이 $?해당 상태로 설정됩니다).

종종 사용할 필요가 없습니다 $?. 쉘의 조건부 구성을 사용하여 0과 0이 아닌 것에 다르게 반응할 수 있습니다.

if genisoimage …; then
  rm rm -rf "$parent_path"
else
  echo 1>&2 "genisoimage failed, aborting"
  exit 2
fi

set -e을 사용 하여 스크립트를 종료 시 오류 모드로 전환 할 수 있습니다 . 간단한 명령이 실패하면(즉, 0이 아닌 상태를 반환하는 경우) 스크립트는 동일한 종료 상태로 즉시 종료됩니다. 예를 들어, 루프 set -e앞 어딘가에 넣으면 실패할 for경우 스크립트가 즉시 종료됩니다 genisoimage.

반복을 계속하면서 실패를 기록하려면 현재 오류 수를 변수에 저장하세요.

successes=0
failures=0
err=0
for file in $(find /shares/media/ -type d -name 'VIDEO_TS')
do
  parent_path="$(dirname -- "$file")"  # or parent_path=${file%/*}
  iso_path="$parent_path.ISO"
  echo "Converting to "$iso_name""
  genisoimage -allow-limited-size -o "$iso_path" -dvd-video "$parent_path"
  ret=$?
  if ((ret == 0)); then
    rm -rf "$parent_path"
    ((++successes))
  else
    ((++failures))
    if ((ret > err)); then ret=$err; fi
  fi
done
echo "Succesfully converted "$total" videos to ISO. There were $failures failures."
exit $err

¹ 과 같은 검색 명령의 경우 grep0은 "발견됨"을 의미하고, 1은 "찾을 수 없음"을 의미하며, 다른 값은 "일부 오류가 발생함"을 의미합니다.

관련 정보