2013-06-24 35 views
0

我想調試一個svn啓動提交腳本,但我看不到USER的值。調試開始提交腳本SVN

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

我使用的是Linux帳戶,

echo $USER 
returns test 

但這種啓動-commit鉤子永遠不會返回0。當我添加一個echo $USER

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

沒有返回值,其迷惑了我。在linux或svn中是否有一些我缺少的魔法?

我也試圖echo $USER > &2返回stderror 沒有成功

+0

在_my_版本的svn(1.7.5)中,USER =「$ 2」'。 – Wrikken

回答

1

爲了看到從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輸出。

+0

'$ USER = 2'不是有效的語法。也許你的意思是'USER = 2'?即使如此,這是一種糟糕的形式 - 對局部變量使用全部大寫名稱意味着您可以使用內置變量和環境變量(它們對於像USER這樣的通用名稱實際上是完全可能的; PAM經常配置爲通過該名稱導出環境變量)。 –

+0

是的,它應該是'USER'而不是'$ USER'。當你同時回答Perl和BASH問題時會發生這種情況。我總是在我的腳本中使用小寫變量名,但在這種情況下,我只是複製用戶的腳本。但是,即使用戶重寫了已建立的內置變量,它在腳本運行後也會恢復到其舊值或用途。這可能是爲什麼有這麼多的shell腳本擁有大寫的變量名。感謝您捕捉該錯誤。 –

2

Read the docs。它說用戶名是第二個參數。

+0

對不起,這是我的錯誤,應該是2,但我更感興趣的問題是爲什麼我不能將任何值返回給命令行,並且使用來自啓動提交腳本的回顯:) – user1431282

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 
: "[email protected]"      # show your argument list in set -x output 
# ...rest of your hook here. 

...那麼,你可以找到從您的會話日誌匹配/tmp/hook-log.*文件。