Я использую скрипт для конвертации всех каталогов 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
¹ Для команд поиска типа grep
0 означает «найдено», 1 означает «не найдено», а другие значения означают «произошла какая-то ошибка».