Все, у меня есть приложение, в котором пользователь выбирает заархивированную папку, которую сценарий оболочки распаковывает, а затем переименовывает для обработки. У заархивированной папки всегда будет следующее соглашение об именах: «rXXXXX_CityName.info.zip». Папка внутри zip-файла называется «CityName.info». Когда сценарий оболочки разархивирует zip-файл, он добавит "rXXXXX_" к имени папки, чтобы создать папку с именем «rXXXXX_CityName.info». Перед распаковкой сценарий оболочки проверяет, существует ли папка с именем «rXXXXX_CityName.info» , и удаляет ее, если она существует. Вот код:

 THEZIPFILE="r12345_Boston.info.zip" 
 DIR="r12345_Boston.info"  
 if [ -d "$DIR" ]; then
    rm -rf "$DIR"
    sleep 1
 fi  

 if [ ! -d "$DIR" ]; then
    unzip -o "$THEZIPFILE" > /dev/null &
    zpid=$!
    wait $zpid
    EXIT_STATUS=$?
    if [ $EXIT_STATUS -eq 0 ]; then
        rm -rf  __MACOSX
        # Do Some processing....
    fi
    echo $EXIT_STATUS
    exit
else
    echo "-1"
    exit
fi

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

3 ответа3

2

Выглядит нормально, просто кажется, что некоторые коды не нужны? Например, вы можете выполнить rm напрямую и запустить unzip без & ждать.

 THEZIPFILE="r12345_Boston.info.zip" 
 DIR="r12345_Boston.info"  
 rm -rf "$DIR"
 unzip -o "$THEZIPFILE" > /dev/null
 EXIT_STATUS=$?
 if [ $EXIT_STATUS -eq 0 ]; then
   rm -rf  __MACOSX
   # Do Some processing....
 fi
 exit $EXIT_STATUS
1

Это может быть более подходящим для StackOverflow.

Тем не менее, вы, вероятно, на правильном пути, но я бы так не поступил.

Обычно сценарии ждут выхода из подпрограммы, если только что-то не сделано, чтобы остановить их, в частности, добавление символа & в конец вашей команды unzip указывает сценарию продолжить без ожидания. Затем у вас есть немного кода, чтобы узнать идентификатор процесса команды и дождаться ее завершения.

Я бы посоветовал вам просто удалить это:

  unzip -o "$THEZIPFILE" > /dev/null

Команда sleep после вашего rm также кажется ненужной.

0

Сценарий не проверяет, существует ли $THEZIPFILE прежде чем пытаться разархивировать его. Кроме того, если $DIR - это простой файл, а не каталог, он не будет удален до распаковки, что приведет к ошибкам.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .