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
Sie können testen, ob ein Verzeichnis mit 'if [-d Verzeichnisname] existiert 'oder um Fa-Datei-Exits zu testen, benutze stattdessen' -f'. – cdarke
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
@cdarke Prost, ich könnte wahrscheinlich das in mein Skript integrieren, um es zum Laufen zu bringen. – jamessct