скрипт svn после фиксации запускается из командной строки, но не при фиксации файлов в svn

StackOverflow https://stackoverflow.com/questions/2555098

Вопрос

У меня есть перехват после фиксации в svn, который отлично запускается из командной строки при запуске

env - ./foo.sh /path/to/svn/repos/ 12345

но когда скрипт вызывается из svn, кажется, что он не работает.

Что я в основном делаю, так это проверяю сохраненные файлы, и если какой-то конкретный файл изменен, я экспортирую его в svn в общий сетевой ресурс.Отлично работает из командной строки.

Сценарий после фиксации выглядит следующим образом:

#!/bin/sh

REPOS="$1"
REV="$2"

CHANGED=`/usr/bin/svnlook changed -r "$REV" "$REPOS"`
SOURCE="svn+ssh://localhost/path/to/svn/repos/somefile.zip"
DEST="/mnt/build/somefile-r$REV.zip"

if [[ "$CHANGED" =~ "trunk/somedir/somefile.zip" ]]
then
        `/usr/bin/svn export --non-interactive --trust-server-cert $SOURCE $DEST`
fi

exit 0

Есть ли способ выводить любые сообщения об ошибках в файл при запуске скрипта или, в частности, в строку экспорта svn (где, я думаю, может возникнуть проблема)?

Это было полезно?

Решение

Стандартный вывод из скрипта-перехватчика отбрасывается, но стандартная ошибка возвращается клиенту, по крайней мере, в последних версиях Subversion.Я думал, что так было некоторое время, но в книге svn 1.4 говорится, что выходные данные отбрасываются, поэтому вы можете захотеть проверить, что у вас установлена обновленная версия сервера - просмотр стандартного потока ошибок - хороший способ получить раннее предупреждение о распространенных типах ошибок.

Чтобы отправить выходные данные команды в файл и включить в файл также вывод стандартной ошибки, чтобы сохранить все это в одном месте, выполните

command >/path/to/logfile 2>&1

Использование >> вместо того , чтобы > для добавления в файл:

command >>/path/to/logfile 2>&1

Поскольку стандартный вывод с ошибкой отправляется обратно клиенту svn, вы также можете передать информацию из стандартного вывода обратно таким образом, либо для одной команды,

command 1>&2

или для всего сценария, поместив

exec 1>&2

в верхней части скрипта.

На первый взгляд, я действительно вижу одну проблему с вашим сценарием:предполагая, что обратные кавычки в строке экспорта svn не являются артефактом разметки, вы должны удалить их.(Они выполнят написанную вами команду экспорта, а затем возьмут ее выходные данные и выполнят эти выходные данные как другую команду - почти наверняка не ту, которую вы намеревались.)

if [[ "$CHANGED" =~ "trunk/somedir/somefile.zip" ]]
then
        /usr/bin/svn export --non-interactive --trust-server-cert $SOURCE $DEST 1>&2
fi

(Я не знал о тестовом синтаксисе с двойными квадратными скобками в bash, это приятное новое открытие для меня!)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top