Git
為 GIT 複製創建理智
我想創建一個每 5 分鐘執行一次 GIT clone sanity 的 Jenkins 管道。如果 GIT 複製命令不工作/失敗或通過,我如何捕捉錯誤/問題?
一般的做法是
if command; then # Every went OK else # Something failed fi
它適用於
git
:if git clone ...; then # The repo was cloned correctly else # Something failed fi
僅當
git clone
命令以狀態 0 退出時才進行第一個分支,表示成功;任何其他退出狀態都被視為失敗,並導致採用第二個分支。
使用不存在的文件
a
,cat
如果git
它相當於:]# e=$(cat a 2>&1 1>/dev/null) ]# echo ret=$? out=\"$e\" ret=1 out="cat: a: No such file or directory"
現在我有命令的輸出,即 cat 的標準輸出被標準錯誤替換,作為“結果”值。返回碼免費提供為
$?
.為了比較成功
cat
:]# e=$(cat atext 2>&1 1>/dev/null) ]# echo ret=$? out=\"$e\" ret=0 out=""
-> 成功重定向到 null、空錯誤消息。
]# e=$(cat atext) ]# echo ret=$? out=\"$e\" ret=0 out="First line of a"
-> 成功,所以 “$e” 保存數據。
]# e=$(cat xxx 2>&1 1>/dev/null) ]# echo ret=$? out=\"$e\" ret=1 out="cat: xxx: Is a directory"
-> 消息詳細,但退出程式碼保持統一。
是的,我有一個目錄
xxx
:git clone .git xxx
當我試圖引發特定錯誤時,它剛剛為我做了。(所以我切換到
cat
)]# e=$(cat -M 2>&1 1>/dev/null) ]# echo ret=$? out=\"$e\" ret=1 out="cat: invalid option -- 'M' Try 'cat --help' for more information." ]#
仍然 ret=1。
評論中的連結顯示了一些關於缺少 git特定錯誤程式碼的投訴。我認為這是一個雙重誤解,因為(瓷器)git 命令是為互動式使用而製作的,而(bash)shell 對輸入和輸出有自己的概念。
在我的範例中,我不應該抱怨 cat 的統一錯誤程式碼“1”,或者嘗試在復雜腳本中擷取和解析消息(這與簡單程序相反)。我應該先檢查一切是否準備就緒,並在必要時告訴使用者(錯誤或警告)。
我想知道你從什麼樣的錯誤程式碼中得到
git clone
。git 的手冊頁對返回碼非常沉默。就像 vi 的例子一樣。非常不同mount
,它的“程式碼可以被 ORed”。給定一個“不安全”命令
git clone $d
,我可以將錯誤程式碼與源一起添加到消息中。這是一個互動式單線:]# d='xxx'; git clone $d || echo "g. cl. failed with $?" fatal: destination path 'xxx' already exists and is not an empty directory. g. cl. failed with 128
作為一個腳本,這不是很明顯;我會這樣做:
]# . gc.sh fatal: destination path 'xxx' already exists and is not an empty directory. g. cl. failed with 128
與
cat gc.sh
:d='xxx' git clone $d; ret=$? if (( $ret > 0 )) then echo "g. cl. failed with $ret" fi
否則
$?
不夠新鮮。並且對真/假的測試也是明確的。