проверьте, успешно ли выполнен 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 указывает на успех, а все остальное — на неудачу¹.

В скрипте оболочки специальная переменная $?содержит статус выхода последней команды. Если вам нужно использовать его больше одного раза, сохраните его в другой переменной (иначе первая команда, использующая его, установит $?его статус).

Часто вам не нужно использовать $?: вы можете использовать условные конструкции оболочки, чтобы по-разному реагировать на ноль и ненулевые значения.

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

Вы можете использовать set -eдля переключения скрипта в режим ошибки при выходе: если простая команда завершается неудачей (т. е. возвращает ненулевой статус), скрипт немедленно завершается с тем же статусом выхода. Например, если вы поместите 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 означает «не найдено», а другие значения означают «произошла какая-то ошибка».

Связанный контент