我有一个提交后在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