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)?

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

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.


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.


Wysłałem niewielką część rzeczywistego kodu. Wykonuję wszystkie kontrole w skrypcie powłoki
smokinguns
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.