скрипт svn после фиксации запускается из командной строки, но не при фиксации файлов в svn
-
23-09-2019 - |
Вопрос
У меня есть перехват после фиксации в 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, это приятное новое открытие для меня!)