Ну, так как никто не ответил на мой вопрос, я собираюсь ответить на него сам. Наконец, мне удалось заставить программу работать, она извлекает файлы, печатает пути к файлам, которые извлекаются, и правильно отображает калибровочную панель, когда каждый файл извлекается. Вот код:
#!/bin/bash
dest="testing" # destination directory
file"example.rar"
(
fc="$(unrar l "$file" | wc -l)" # get file count inside RAR file
fc="$((fc-10))" # file count has 10 extra lines, remove them
i=0 # index counter
unrar x "$file" "$dest" | while IFS="" read -r in ; do
# extract the pathname of file being extracted
f=$(echo $in | cut -d ' ' -f 2)
echo "XXX"
echo "$f..." # Display file name in the dialog box
echo "XXX"
echo "$pct %" # Show percent
pct="$((100*(++i)/fc))" # Calculate current percent
done
) | dialog --title "Extracting Files" --gauge "Please wait" 8 75 0
Следующая часть должна захватывать результат выполнения извлечения файла .RAR, однако я не уверен, если в этот момент я просто захватывая результат выполнения диалогового окна или команды unrar. То, что я хочу сделать, это контролировать поток сценария в случае сбоя команды unrar, я не совсем уверен в том, как я должен действовать, но прямо сейчас, после строки, где я показываю диалог, я добавляю следующее if-then :
if [ "$?" ]; then
clear
echo "Command successful"
fi
Правильно это или нужно переместить блок if-then в другое место в коде?
В то же время Imma работает таким образом, чтобы этот скрипт работал как некоторая преувеличенная команда unrar, где вы можете указать имя файла, которое будет извлечено, и дополнительный целевой каталог, таким образом я смогу чтобы исключить необходимость указать каталог
Edit:
Это текущий код, я использую для решения моего вопроса. Пока что код, похоже, отлично справляется с ошибками. Я тестировал его только с ошибками «Файл уже существует», который останавливает выполнение скрипта, чтобы ждать ввода от пользователя, и ошибки CRC для случаев, когда вы разбивали сжатые файлы в разных частях и один из них пропал, отсутствует.
#!/bin/bash
dest="testing" # destination directory
file="example.rar"
(
fc="$(unrar l "$file" | wc -l)" # get file count inside RAR file
fc="$((fc-10))" # file count has 10 extra lines, remove them
i=0 # index counter
# I have to redirect the output from 0 to 1 because when there's a
# "file already exists" kind of error, unrar halts the execution of the
# script to wait for user input, so I have to process that message inside
# of the loop
unrar x "$file" "$dest" 0>&1 2>&1 | while IFS="" read -r in ; do
# we got a "file already exists" message?
if [[ "$f" == *"already"* ]]; then
echo "Error" # display an error message
break # exit the while loop
fi
# extract the pathname of file being extracted
f=$(echo $in | cut -d ' ' -f 2)
echo "XXX"
echo "$f..." # Display file name in the dialog box
echo "XXX"
echo "$pct %" # Show percent
pct="$((100*(++i)/fc))" # Calculate current percent
done
exit ${PIPESTATUS[0]} # exit with status message we got from unrar
) | dialog --title "Extracting Files" --gauge "Please wait" 8 75 0
# if PIPESTATUS[0] is not equal to zero, it means there was an error
if [[ "${PIPESTATUS[0]}" -ne 0 ]]; then
echo "There was an error." # display a message
exit 1 # exit with status 1
fi
# if command was successful, display a message
if (("$?" == 0)); then
echo "Command executed correctly $?"
fi
До сих пор я ничего с ошибками не делать, я просто заинтересован в их обнаружения и возвращения сообщения в сценарии, которые называют этот. Кажется, что все работает нормально, но я знаю, что для этого должен быть лучший способ. Что ты думаешь?
'if [" $? " ] 'всегда верно. Это точно эквивалентно '[-n" $? " ] ', который спрашивает, расширяет ли' $? 'пустую строку. Будь то 0, 1 или что-то еще, оно всегда не пустое. –
'if [" $? " -eq 0] ', возможно, это то, что вы пытались написать, или эквивалент bash-y' if (($? == 0)) ', хотя использование' $? 'вообще - это немного запаха кода; лучше напрямую проверять команду внутри оператора 'if'. –
@CharlesDuffy Я пытаюсь проверить результат выполнения unrar, чтобы поймать ошибки (как вы уже знаете), но так как команда выполняется внутри подклассов (насколько я понимаю), а затем результат подоболочка перенаправляется в диалог (что, как мне кажется, происходит здесь), ловушка ошибок внутри подоболочки не повлияет на выполнение диалога? Мое намерение состоит в том, чтобы остановить выполнение команды, как только произойдет ошибка. Что было бы лучшим решением для обнаружения ошибок в этом коде? –