2015-09-01 2 views
-2

Я пытаюсь извлечь RAR-файл в целевой каталог с помощью команды unrar, но я не хочу отображать список нормальных файлов, который отображается unrar при выполнении. То, что я хочу сделать вместо этого, это показывает прогресс бар, который показывает процесс в процентах, используя dialog --gauge, но до сих пор я только получаю ошибкуUnrar and Progress Bar Bash

syntax error: unexpected end of file

Вот код, я использую:

#!/bin/bash 
dest="testing" 
file"example.rar" 
cmd="$(unrar x "$file" "$dest")" &>/dev/null 

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 
(
    for f in "$cmd"; do 
    pct="$((100*(++i)/fc))" # calculate percentage 
    cat <<EOF 
    XXX 
    $pct 
    Extracting file "$f"... 
    XXX 
    EOF 
    done 
) | dialog --title "Extracting Files" --gauge "Please wait" 7 70 0 

До сих пор код извлекает файлы в папке dest, но они не показывают диалоговое окно и показывают ошибку unexpected end of file после завершения извлечения файла. Он не отображает извлеченные файлы, которые следует ожидать, используя &>/dev/null, но я не могу правильно отобразить диалоговое окно.

Я получил этот код из различных примеров, которые я нашел в Интернете, но до сих пор я не могу заставить его работать. Может ли кто-нибудь указать мне в правильном направлении?

ответ

0

Ну, так как никто не ответил на мой вопрос, я собираюсь ответить на него сам. Наконец, мне удалось заставить программу работать, она извлекает файлы, печатает пути к файлам, которые извлекаются, и правильно отображает калибровочную панель, когда каждый файл извлекается. Вот код:

#!/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 

До сих пор я ничего с ошибками не делать, я просто заинтересован в их обнаружения и возвращения сообщения в сценарии, которые называют этот. Кажется, что все работает нормально, но я знаю, что для этого должен быть лучший способ. Что ты думаешь?

+0

'if [" $? " ] 'всегда верно. Это точно эквивалентно '[-n" $? " ] ', который спрашивает, расширяет ли' $? 'пустую строку. Будь то 0, 1 или что-то еще, оно всегда не пустое. –

+0

'if [" $? " -eq 0] ', возможно, это то, что вы пытались написать, или эквивалент bash-y' if (($? == 0)) ', хотя использование' $? 'вообще - это немного запаха кода; лучше напрямую проверять команду внутри оператора 'if'. –

+0

@CharlesDuffy Я пытаюсь проверить результат выполнения unrar, чтобы поймать ошибки (как вы уже знаете), но так как команда выполняется внутри подклассов (насколько я понимаю), а затем результат подоболочка перенаправляется в диалог (что, как мне кажется, происходит здесь), ловушка ошибок внутри подоболочки не повлияет на выполнение диалога? Мое намерение состоит в том, чтобы остановить выполнение команды, как только произойдет ошибка. Что было бы лучшим решением для обнаружения ошибок в этом коде? –