Linux 调试启动提交脚本SVN

Linux 调试启动提交脚本SVN,linux,svn,Linux,Svn,我正在尝试调试svn启动提交脚本,但似乎无法获取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中是否有我

我正在尝试调试svn启动提交脚本,但似乎无法获取
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
没有成功。它说用户名是第二个参数。

。它说用户名是第二个参数。
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.*

匹配的文件中找到会话中的日志。
stderr
的输出仅在hook失败时由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.*

匹配的文件中找到会话日志。要查看Subversion hook的输出,您需要做两件事:

  • 将要查看的所有内容输出到
    STDERR
    ,而不是
    STDOUT
    echo
    命令的默认输出)
  • 挂断钩子。您需要的不是退出
    0
您的echo语句需要是:

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
输出。

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

  • 将要查看的所有内容输出到
    STDERR
    ,而不是
    STDOUT
    echo
    命令的默认输出)
  • 挂断钩子。您需要的不是退出
    0
您的echo语句需要是:

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
输出。

user=“$2”在我的svn版本(1.7.5)中。
user=“$2”
在我的svn版本(1.7.5)中。对不起,这是我的错误,应该是2,但我更感兴趣的问题是,为什么我不能用start-commit脚本中的echo将任何值返回到命令行:)对不起,这是我的错误,应该是2,但我更感兴趣的问题是,为什么我不能从start-commit脚本向带有echo的命令行返回任何值:)
$USER=2
是无效语法。也许你的意思是
USER=2
?即便如此,这也是一种糟糕的形式——对局部变量使用所有caps名称意味着您可能会与内置变量和环境变量发生命名空间冲突(对于
USER
这样的通用名称,这实际上是完全可能的;例如,PAM经常被配置为按该名称导出环境变量),它应该是
USER
,而不是
$USER
。这就是同时回答Perl和BASH问题时发生的情况。我总是在脚本中使用小写变量名,但在本例中,我只是复制用户的脚本。但是,即使用户重写了一个已建立的内置变量,它也会在脚本运行后恢复到原来的值或用途。这可能就是为什么有如此多的shell脚本使用大写的变量名。感谢您捕获该错误。
$USER=2
语法无效。也许你的意思是
USER=2
?即便如此,这也是一种糟糕的形式——对局部变量使用所有caps名称意味着您可能会与内置变量和环境变量发生命名空间冲突(对于
USER
这样的通用名称,这实际上是完全可能的;例如,PAM经常被配置为按该名称导出环境变量),它应该是
USER
,而不是
$USER
。这就是同时回答Perl和BASH问题时发生的情况。我总是在脚本中使用小写变量名,但在本例中,我只是复制用户的脚本。但是,即使用户重写了一个已建立的内置变量,它也会在脚本运行后恢复到原来的值或用途。这可能就是为什么有如此多的shell脚本使用大写的变量名。谢谢你抓住了那个虫子。