2012-12-05 59 views
6

我正在編寫一個腳本來自動爲我設置新項目。從git命令捕獲輸出?

這包括拉下github存儲庫。

我想要做的是從我的一些腳本輸出,然後調用git clone $repo

我想表明從該命令的輸出在運行時,但是當它運行,如果它已成功運行代替它的輸出(注意只是git命令的輸出,我仍然希望之前的輸出在那裏)和repository successfully cloned,如果失敗,就把輸出留在那裏,然後打印repository cloning failed

我該怎麼做?

下面是我目前(相當簡單)的腳本。

#! /bin/bash 

# -p project name 

templateurl="[email protected]:xxx/xxx-site-template.git" 

while getopts ":p:" opt; do #eventually I'll add more options here 

case $opt in 
    p) 
    project=$OPTARG 
    ;; 
    \?) 
    echo "Invalid option: -$OPTARG" >&2 
    exit 1 
    ;; 
    :) 
    echo "Option -$OPTARG requires an argument." >&2 
    exit 1 
    ;; 
esac 
done 

if [ -z "$project" ]; then 
    echo "Project name required" 
    exit 1 
fi 

clear 
echo "|==========================|" 
echo "| New xxx Project Creator |" 
echo "|==========================|" 
echo "Project: $project" 

if [ -d "$project" ]; then 
    echo "Directory $project already exists!" 
    exit 1 
fi 


mkdir $project 
if [ ! -d "$project" ]; then 
    echo "Failed to create project directory!" 
    exit 1 
fi 

echo "Cloning xxx Template repository" 
git clone $templateurl $project 

回答

10

git clone確實提供退出代碼,您可以使用$讀取?如下所示:

git clone [email protected]:repo 
echo $? 

如果一切正常,它將打印0。例如,如果該文件夾不是一個Git倉庫,你會得到退出代碼128

您可以檢查是否克隆工作如下:

git clone [email protected]:repo localrepo --quiet 
success=$? 
if [[ $success -eq 0 ]]; 
then 
    echo "Repository successfully cloned." 
else 
    echo "Something went wrong!" 
fi 

--quiet將抑制從混帳任何輸出,只要沒有錯誤。所以如果你只是刪除else分支,你會得到正面的輸出或git產生的錯誤。

+0

我已經將腳本的底部改爲'git clone $ templateurl $ project --quiet success = $? if [[success -eq 0]]; 然後 echo「已成功克隆存儲庫」。 fi' 但是我得到錯誤'[[:未找到]與if語句行。另外,我認爲我的問題稍有誤解,我仍然希望在命令運行時顯示正常輸出,以便用戶獲得有關正在發生的事情的一些反饋。但是一旦命令完成,我想清除那個輸出。 – Hailwood

+0

if語句中有$ missing:'[[$ success ...;'如果你想刪除已經打印的輸出,你必須處理回車符(\ r),然後覆蓋舊的輸出。我假設刪除已經打印的輸出是不可能的。 – sge

+0

另一種可能性是使用ANSI-Escape-Codes http://ascii-table.com/ansi-escape-sequences.php。例如'echo -e「\ 033 [2K」'刪除活動行。設置光標位置和刪除線條的組合可能會導致成功。 – sge

4
git clone [email protected]:repo localrepo > git.log 2>&1 
if [[ $? eq 0 ]]; 
then 
    echo Repository successfully cloned. 
else 
    cat git.log 
    echo Repository cloning failed. 
fi 

rm git.log 

說明:

git clone [email protected]:repo localrepo > git.log 2>&1 重定向輸出和錯誤流git.log。 > git.log將stdout重定向到git.log 2>&1將stderr重定向到與stdout相同的位置(因此,git.log)。

$? eq 0檢查git的retcode,如果克隆成功,它應該是0。

cat git.log輸出git.log文件的內容。

+0

'GITOUTPUT = \'git clone user @ server:repo localrepo \'''''''''''''''''''''即使'git clone ...>/dev/null'也不會抑制任何輸出。 – sge

+1

然後它必須寫入stderr。我會發佈一個不同的答案。 – antik

+1

git checkout也去stderr(但git拉到標準輸出?)。這救了我! – rob5408