ОК, так что я начинаю начинать с скриптов bash, и я знаю, что вопрос, вероятно, сформулирован немного неловко, но я буду предельно ясен!Проблема с обработкой ошибок в моем первом скрипте bash
Я написал следующий сценарий для создания резервной копии репозиториев в папке. Сценарий выглядит следующим образом:
#!/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
Этот сценарий успешно производит .gzip подпорки из всех хранилищ в «вар/SVN», когда скрипт вызывается без аргументов, и создает .gzip резервные копии определенных хранилищ которые называются аргументами. Большой!
Однако, если сценарий запущен с аргументом, который не соответствует существующему репозиторию, программа сбой выдаст сообщение об ошибке: svnadmin: E000002: Can't open file '/var/svn/ada/format': No such file or directory
. Я пытаюсь добиться этой ошибки и распечатать на консоли более удобный вывод. Я пытался сделать это, используя «ловушку».
Сначала я добавил следующую строку:
trap 'echo ERROR! The repository or repositories that you are trying to backup do not exist!' ERR
... а потом я нажал ошибку в/DEV/нуль в этой точке в финале для цикла:
svnadmin dump $SVNREPO/$REPO -r HEAD 2>/dev/null | gzip > $TEMP/$REPO.svn.gzip
Я оттолкнул к файлу/dev/null в том месте, где я был, потому что это ошибка программы. Однако сценарий больше не работает. Что я здесь делаю неправильно? Это вопрос, связанный с наличием 2>/dev/null
в середине строки? Если да, то как я мог бы реорганизовать этот код так, чтобы он не требовал, чтобы канал находился в середине линии?
Большое спасибо за любую помощь, я надеюсь, что мой вопрос достаточно ясен! Для того, чтобы подтвердить, окончательный нерабочим код выглядит следующим образом:
#!/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
Вы можете проверить, чтобы увидеть, если каталог существует с ', если [каталог имя-d] 'или для проверки выходных файлов fa вместо' -f'. – cdarke
Различия и переменные двойных кодов, они решат большинство проблем в 'bash',' для REPO в "$ @" 'и' для REPO в '$ {ARRAY [@]} "' – Inian
@cdarke Привет, я могу вероятно, включите это в мой скрипт, чтобы заставить его работать. – jamessct