2009-07-10 57 views
1

我在Linux服務器上設置了Mercurial存儲庫,並且有些(但不是全部)用戶有權推送到它。他們通過ssh連接到版本庫。爲unix組的成員設置Mercurial

這些用戶是unix組的成員。以下是我正在使用的腳本來更改存儲庫以允許它從它們接收推送。

這可以改進嗎?這裏有沒有不必要的操作? bash腳本有什麼不好的風格?

#!/bin/bash                  

if [[ $# -lt 2 ]]; then 
    echo Usage: $0 directory groupname 
    exit 1 
fi 

if ! chown -R :$2 $1; then 
    echo chown failure 
    exit 2 
fi 

if ! find $1/.hg -type d -exec chmod g+s {} \;; then 
    echo chmod failure 
    exit 3 
fi 

if ! find $1 -perm -u+r -exec chmod g+r {} \;; then 
    echo chmod failure 2 
    exit 4 
fi 

if ! find $1 -perm -u+w -exec chmod g+w {} \;; then 
    echo chmod failure 3 
    exit 5 
fi 

if ! find $1 -perm -u+x -exec chmod g+x {} \;; then 
    echo chmod failure 4 
    exit 6 
fi 

回答

1

運行查找與-exec啓動一個單獨的每個文件的chown進程。你會得到很多小於過程鞭打(和更快的速度),如果你這樣做:

find "$1"/.hg -type d -print0 | xargs chmod g+s 
find "$1" -perm -u+r -print0 | xargs chmod g+r 
find "$1" -perm -u+w -print0 | xargs chmod g+w 
find "$1" -perm -u+x -print0 | xargs chmod g+x 

順便說一句,你看Mercurial的ACL Extension結合hg-ssh?只要唯一的訪問權限是ssh,它就會執行相同的操作。

+1

較新的GNU發現(他們實現它相對較晚,它在POSIX年代以來......)知道「-exec .... {} +」,它將使用盡可能多的參數生成進程,以適應環境空間,有效地做xargs會做的事情。 – TheBonsai 2009-07-10 04:58:59

1

幾個小東西:它是通過>&2重定向呼應錯誤消息到stderr一個好主意。而且你應該在變量周圍添加雙引號,這樣你的腳本就可以處理有空格的文件名。

如果出現錯誤,您可以將初始行更改爲#!/bin/bash -e以使腳本立即退出。這可以讓你刪除所有的if陳述。如果你想盡快的東西無法停止腳本

#!/bin/bash 

function uhoh() { 
    echo "error in script!" >&2 
    exit 1 
} 

trap uhoh ERR 

if [[ $# -lt 2 ]]; then 
    echo "Usage: $0 directory groupname" >&2 
    exit 1 
fi 

chown -R :"$2" "$1" 
find "$1"/.hg -type d -exec chmod g+s {} \; 
find "$1" -perm -u+r -exec chmod g+r {} \; 
find "$1" -perm -u+w -exec chmod g+w {} \; 
find "$1" -perm -u+x -exec chmod g+x {} \; 

個人而言,我只希望與/bin/bash -e選擇走:或者,如果你想要更多的控制,你可以使用trap ERR命令調用自定義錯誤處理代碼。我認爲檢查每個命令的結果併爲每個命令設置不同的退出代碼是過度的。你不需要那麼強大,沒有人會做任何不同的退出代碼3與退出代碼4 ...