2017-02-21 3 views
0

OK, also bin ich ein absoluter Anfänger mit Bash-Skripten und ich bin mir bewusst, dass die Frage wahrscheinlich ein wenig ungeschickt formuliert ist, aber ich werde so klar wie möglich!Fehler bei der Fehlerbehandlung in meinem ersten Bash-Skript

Ich habe das folgende Skript geschrieben, um eine Sicherung von Repositories in einem Ordner zu erstellen. Das Skript ist wie folgt:

#!/bin/bash 

SVNREPO="/var/svn" 
TEMP="/var/tmp" 
BACKUP="/home/helix/backups" 

cd $SVNREPO 

if [ $# -eq 0 ]; then 
    for REPO in *; do 
     ARRAY+=($REPO) 
    done 
else 
    for REPO in [email protected]; do 
     ARRAY+=($REPO) 
    done 
fi 

for REPO in ${ARRAY[@]}; do 
    svnadmin dump $SVNREPO/$REPO -r HEAD | gzip > $TEMP/$REPO.svn.gzip sd 
    cp $TEMP/$REPO.svn.gzip $BACKUP/$REPO.svn.gzip 
    rm $TEMP/$REPO.svn.gzip 
done 

Dieses Skript .gzip Sicherungen der all die Repositories in ‚var/svn‘ erfolgreich produziert, wenn das Skript ohne Argumente aufgerufen wird, und erstellt .gzip Sicherungen der spezifischen Repositories Diese werden als Argumente bezeichnet. Groß! Wenn das Skript mit einem Argument ausgeführt wird, das einem vorhandenen Repository nicht entspricht, stürzt das Programm jedoch mit der folgenden Fehlermeldung ab: svnadmin: E000002: Can't open file '/var/svn/ada/format': No such file or directory. Was ich versuche zu erreichen ist, diesen Fehler zu erfassen und eine benutzerfreundlichere Ausgabe an die Konsole zu drucken. Ich habe versucht, dies mit "Trap" zu tun.

Zuerst habe ich die folgende Zeile:

trap 'echo ERROR! The repository or repositories that you are trying to backup do not exist!' ERR 

... und dann schob ich den Fehler zu/dev/null an diesem Punkt in der letzten Schleife für:

svnadmin dump $SVNREPO/$REPO -r HEAD 2>/dev/null | gzip > $TEMP/$REPO.svn.gzip 

I gedrückt an der/dev/null-Datei an der Stelle, die ich gemacht habe, weil hier das Programm ausfällt. Das Skript scheint jedoch nicht mehr zu funktionieren. Was mache ich hier falsch? Ist es ein Problem mit der 2>/dev/null in der Mitte einer Linie zu tun? Wenn ja, wie kann ich diesen Code so umgestalten, dass die Pipe in der Mitte der Zeile nicht benötigt wird?

Vielen Dank für jede Hilfe, ich hoffe meine Frage ist einigermaßen klar! Um zu bestätigen, das letzte nicht-funktionierenden Code ist wie folgt:

#!/bin/bash 

SVNREPO="/var/svn" 
TEMP="/var/tmp" 
BACKUP="/home/helix/backups" 

cd $SVNREPO 

if [ $# -eq 0 ]; then 
    for REPO in *; do 
     ARRAY+=($REPO) 
    done 
else 
    for REPO in [email protected]; do 
     ARRAY+=($REPO) 
    done 
fi 

trap 'echo ERROR! The repository or repositories that you are trying to backup do not exist!' ERR 

for REPO in ${ARRAY[@]}; do 
    svnadmin dump $SVNREPO/$REPO -r HEAD 2>/dev/null | gzip > $TEMP/$REPO.svn.gzip sd 
    cp $TEMP/$REPO.svn.gzip $BACKUP/$REPO.svn.gzip 
    rm $TEMP/$REPO.svn.gzip 
done 
+1

Sie können testen, ob ein Verzeichnis mit 'if [-d Verzeichnisname] existiert 'oder um Fa-Datei-Exits zu testen, benutze stattdessen' -f'. – cdarke

+1

Doppel-Anführungsstrich Erweiterungen und Variablen, es wird die meisten Probleme in 'bash' lösen,' für REPO in "$ @" 'und' für REPO in "$ {ARRAY [@]}" ' – Inian

+1

@cdarke Prost, ich könnte wahrscheinlich das in mein Skript integrieren, um es zum Laufen zu bringen. – jamessct

Antwort

1

Ich weiß nicht genau, wie trap Befehl funktioniert, aber ich werde einen anderen Weg vorschlagen, dass Ihr Problem auf andere Weise lösen könnten:

Erste , vor Ihrer for Schleife, fügen diese Zeile:

set -o pipefail 

Dies bedeutet, dass, wenn jeder Befehl in einem Rohr aus, der letzten Beendigungscode ($?) den Fehlercode enthält, falls vorhanden fehlgeschlagen.

Auf der Linie direkt nach dem svnadmin Anruf, ich würde das Hinzufügen vorschlagen:

if [ $? -ne 0 ]; then 
    echo "ERROR! Received error code $? for repository '$REPO'." 
    continue 
fi 

Sie können natürlich die Fehlermeldung zu Ihrem Geschmack verändern. Die Funktionalität sollte klar sein: Wenn svnadmin oder bzip fehlschlägt, wird eine Fehlermeldung ausgegeben und mit dem nächsten Element in der for-Schleife fortgefahren.

Hoffe, das hilft.

+0

Ich habe dies versucht und es gibt einen Fehler unabhängig davon, ob es richtige, falsche oder keine Argumente gibt. – jamessct

1

@cdarke Vorschlag zu prüfen Verwenden ob eine Datei existiert, ich habe es jetzt mit dem folgenden Code arbeiten:

#!/bin/bash 

SVNREPO="/var/svn" 
TEMP="/var/tmp" 
BACKUP="/home/helix/backups" 

cd $SVNREPO 

if [ $# -eq 0 ]; then 
    for REPO in *; do 
     ARRAY+=($REPO) 
    done 
else 
    for REPO in [email protected]; do 
     ARRAY+=($REPO) 
    done 
fi 

for REPO in ${ARRAY[@]}; do 
    if [ -f $SVNREPO/$REPO/format ]; then 
     vnadmin dump $SVNREPO/$REPO -r HEAD 2>/dev/null | gzip > $TEMP/$REPO.svn.gzip 
     cp $TEMP/$REPO.svn.gzip $BACKUP/$REPO.svn.gzip 
     rm $TEMP/$REPO.svn.gzip 
    else 
     echo ERROR! The repository $REPO does not exist. No backup has been made for this argument. 
    fi 
done 
+0

Wenn Sie eine Antwort auf Ihre Frage gefunden haben, sollten Sie die Antwort akzeptieren (auch Ihre eigene Antwort), indem Sie auf das Häkchen neben der Antwort klicken. –

Verwandte Themen