0

我正在尝试调试 svn start-commit 脚本,但似乎无法获得USER.

#!/bin/sh
USER="$2"
if [ "$USER" = "test" ]; then exit 0; fi 

我正在使用一个 linux 帐户

echo $USER 
returns test

但是这个 start-commit 钩子永远不会返回 0。当我添加一个echo $USER之前

if [ "$USER" = "test" ]; then exit 0; fi 

没有返回值让我感到困惑。linux 或 svn 中是否有一些我想念的魔法?

我也尝试echo $USER > &2返回 stderror 但没有成功

4

3 回答 3

2

阅读文档。它说用户名是第二个参数。

于 2013-06-24T17:01:54.187 回答
1

stderr仅当钩子失败时,Subversion 才会将输出返回给调用者;它不会在成功时传输。

如果要无条件记录,最好记录到文件:

#!/bin/bash
#      ^^^^ using /bin/sh turns off bash-specific features; use /bin/bash instead

exec >/tmp/hook-log.$$ 2>&1   # redirects both stdout and stderr to a log file
PS4=':$BASH_SOURCE:$LINENO+'  # sets the format string used by set -x to include
                              # ...source file and line number in each line of
                              # ...output
set -x                        # tells the shell to log each command it runs,
                              # ...prefixed by the evaluated content of the
                              # ...format string set in PS4
: "$@"                        # show your argument list in set -x output
# ...rest of your hook here.

...然后,您可以在匹配的文件中找到会话日志/tmp/hook-log.*

于 2013-06-24T17:08:56.910 回答
1

为了查看 Subversion 钩子的输出,您需要做两件事:

  • 输出您想要查看的所有内容,STDERR而不是STDOUT(命令的默认输出echo)。
  • 失败的钩子。你需要有一些东西,而不是0.

您的回声语句需要是:

echo "User = '$USER'" >&2

>&2会将输出移动echo到 STDERR。

然后,您必须在exit 2脚本底部添加一个。您将无法提交更改,因为您的钩子总是会失败,但您将能够看到钩子脚本的输出。

我通过将我所做的一切记录到 STDERR 来利用这种行为。如果钩子按计划工作,用户什么也看不到。否则,用户会得到他们可以发送给我分析的日志输出。

您可能需要执行以下操作:

USER=$2
if [ $USER = "test" ]
then
    exit_code=2
else
    exit_code=0
fi
[...]
exit $exit_code

这样,如果用户test尝试某些操作,钩子将失败,您将看到所有STDERR输出。

于 2013-06-24T17:27:18.583 回答