@I_Vetrov

Почему в коде скрипта на sh не везде срабатывает exit 1?

Всем привет!
Есть pre-commit hook скрипт на sh для subversion. Среди прочего, скрипт должен запрещать коммит файлов больше определённого размера. Дело в том, что даже при выполнении условия соотношения размеров и прохождения по ветке if-then скрипт не выполняет exit 1 и не выводит сообщение echo.
С помощью разных echo было выяснено, что скрипт точно получает и верно интерпретирует значения всех переменных, а так же проводит сравнение. Если прописать какое-нибудь эхо перед строкой
echo "File '$file' too large to commit" >&2
и после exit 1 -- они выполнятся.

В конечном итоге коммитится файл любого размера, не смотря на то, что скрипт верно проводит сравнение и идёт по ветке с exit 1.

Ещё в этом скрипте есть часть с проверкой на расширения (здесь не приведена), там exit 1 нормально выполняется.
В общем, какие-то странности.
Буду благодарен за любые советы.

#!/bin/sh
REPOS="$1"
TXN="$2"
SVNLOOK="/usr/local/bin/svnlook"
maxsize=20000000 #ограничение на максимальный размер файла (не коммита целиком) в байтах
$SVNLOOK changed -t $TXN $REPOS | while read status file
do
    [[ $status == "D" ]] && continue  # Skip Deletions
    [[ $file == */ ]] && continue     # Skip directories
    size=$($SVNLOOK filesize -t $TXN $REPOS $file)
    if [ $size -gt $maxsize ]
    then
        echo "File '$file' too large to commit" >&2
        exit 1
    fi
done
exit 0
  • Вопрос задан
  • 525 просмотров
Решения вопроса 1
Softer
@Softer
А если как-то так?

while read status file
do
    [[ $status == "D" ]] && continue  # Skip Deletions
    [[ $file == */ ]] && continue     # Skip directories
    size=$($SVNLOOK filesize -t $TXN $REPOS $file)
    if [ $size -gt $maxsize ]
    then
        echo "File '$file' too large to commit" >&2
        exit 1
    fi
done < <($SVNLOOK changed -t $TXN $REPOS)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@younghacker
Прежде всего я бы перевенул цикл while чтобы он не запускался в subshell
И выведите результат работы команды в файл чтобы потом можно было проанализировать ожидаемо ли содержимое.

SVNRESULT=`$SVNLOOK changed -t $TXN $REPOS`
echo -e"`date '+%F %T'`\n${SVNRESULT}" >> ~/debug-svn.log
while read status file; do
....
done <<<"${SVNRESULT}"


И возьмите все переменные в двойные кавычки в именах файлов могут быть пробелы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы