Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash:如何捕获git命令失败?_Git_Bash - Fatal编程技术网

Bash:如何捕获git命令失败?

Bash:如何捕获git命令失败?,git,bash,Git,Bash,我有一个命令: ... { git filter-branch -f --env-filter "$ENVFILTER" >/dev/null echo "Git updated. Run 'git push -f BRANCH_NAME' to push your changes." } || { echo "Git failed. Please make sure you run this on a clean working directory." // th

我有一个命令:

...
{
    git filter-branch -f --env-filter "$ENVFILTER" >/dev/null
    echo "Git updated. Run 'git push -f BRANCH_NAME' to push your changes."
} || {
    echo "Git failed. Please make sure you run this on a clean working directory." // this doesn't ever get called
}
快乐之路是可行的,但它看起来从来没有执行过
|
。这就是失败的样子:

[~/Documents/my-repo]$ my-custom-command                                                                           
WARNING: Ref 'refs/heads/master' is unchanged
Git updated. Run 'git push -f BRANCH_NAME' to push your changes.
[

有没有办法抓住那个错误?即使它只是匹配了
警告:Ref'refs/heads/master'没有改变
打印出来的字符串(顺便说一下,我想隐藏它)

git
之后的
echo
命令无论如何都会执行,这是第一个问题。 第二个问题是,此
echo
命令更新错误代码:第一个错误代码被覆盖

我建议采用“经典”方法(可能有点过时,我是在ksh长大的):


稍微偏离主题:MS-DOS/Windows用户会对此感到惊讶,因为在Windows中,
echo
不会更改
ERRORLEVEL

echo“Git updated”行会杀死错误代码。它只是将其设置为0。@yellownantphil若有任何
echo
失败的可能性,那个就是危险-请看(当我偶然发现它时,我发现它非常有用)。@cxw并没有想到这一点。我觉得yellowantphil的语法非常好。但是ksh永远:)但是说真的,
echo
为什么要用固定的字符串参数失败呢?@Jean-Françoisfare我不知道:):)。它吓了我一跳,因为在我读了链接的答案后,我停止使用
x&&y|z
,尽管这是最自然的语法。我想我是在努力帮助人们避免(不太可能的)陷阱,希望他们也能为我这样做@让·弗朗索瓦·法布哦!这个怎么样
echo“foo”1>&-
给出
-bash:echo:write error:Bad file descriptor
$?=1
。如果您有一个使用stdout玩游戏的过于复杂的脚本,它实际上可能会发生。:)@Edmund您还可以内联:
if git-filter分支-f--env-filter“$ENVFILTER”>/dev/null;然后
如果你想要短一点的,其他的都一样。哈,叫
ksh
“老式”。。。Korn shell的历史只能追溯到1983年!(承认我自己才开始几年…)1983年,我12岁,只是学习基础知识,我是一个追溯游戏/追溯计算迷,所以这不是一个贬义的评论:)
git filter-branch -f --env-filter "$ENVFILTER" >/dev/null
if [ $? = 0 ] ; then
    echo "Git updated. Run 'git push -f BRANCH_NAME' to push your changes."
else
    echo "Git failed. Please make sure you run this on a clean working directory."
fi