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은 성공을 의미하고, 다른 값은 실패를 의미합니다.

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

일반적으로 그럴 필요는 없습니다 $?. 쉘의 조건부 구성을 활용하여 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

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

관련 정보