Rozpakowywanie plików za pomocą skryptu powłoki

0

Wszystko, Mam aplikację, w której użytkownik pobiera spakowany folder, który rozpakowuje skrypt powłoki, a następnie zmienia nazwę do przetwarzania. Spakowany folder zawsze będzie miał następującą konwencję nazewnictwa: „rXXXXX_CityName.info.zip” . Folder w pliku zip ma nazwę „CityName.info” Gdy skrypt powłoki rozpakuje plik zip, dopisze „rXXXXX_” do nazwy folderu, aby utworzyć folder o nazwie „rXXXXX_CityName.info” . Przed rozpakowaniem skrypt powłoki sprawdza, czy wywołano folder „rXXXXX_CityName.info” istnieje i usuwa je, jeśli tak. Oto kod:

 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

Chcę wiedzieć, czy ten kod nie pozostawia miejsca na błędy? Czy mam rację zakładając, że powyższy kod wykona się sekwencyjnie (tzn. Czeka na zakończenie każdego polecenia, zanim przejdzie do następnego)?

smokinguns
źródło

Odpowiedzi:

2

Wygląda OK, wydaje się, że niektóre kody są niepotrzebne? Na przykład możesz to zrobić rm bezpośrednio i możesz uruchomić unzip bez & czekać.

 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
lk_vc
źródło
1

Może to być bardziej odpowiednie dla StackOverflow.

Powiedziałeś, że prawdopodobnie jesteś na dobrej drodze, ale nie zrobiłbym tego w ten sposób.

Zwykle skrypty czekają na zakończenie podprogramu, chyba że zrobi się coś konkretnego, aby je zatrzymać, w szczególności dodając & do końca twojego unzip polecenie mówi skryptowi, aby kontynuował bez czekania. Następnie masz dość kodu, aby znaleźć identyfikator procesu komendy i poczekać, aż się zakończy.

Proponuję po prostu go usunąć:

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

The sleep polecenie po twoim rm również wydaje się niepotrzebne.

GregHNZ
źródło
0

Skrypt nie weryfikuje $THEZIPFILE istnieje przed próbą rozpakowania. Także jeśli $DIR jest zwykłym plikiem, a nie katalogiem, nie zostanie usunięty przed rozpakowaniem, które następnie wyświetli błędy.

Brian Swift
źródło
Wysłałem niewielką część rzeczywistego kodu. Wykonuję wszystkie kontrole w skrypcie powłoki
smokinguns