Bash总是返回错误代码eq 0

时间:2016-08-26 11:12:20

标签: bash

我正在尝试检查文件夹是否是git或svn存储库的一部分。 我使用以下命令来获取它并将错误代码存储在变量中。

RSVN=`svn status &> /dev/null; echo $?`
RGIT=`git status &> /dev/null; echo $?`

问题是我总是得到0作为错误代码。

我在命令行中尝试它,我得到了预期的结果

user@host trunk$ svn status &> /dev/null;
user@host  trunk$ echo $?
0
user@host  trunk$ git status &> /dev/null;
user@host  trunk$ echo $?
128

但是当我运行脚本时,我得到了:

+ + svn status

+ echo 0
+ RSVN=0
M       buildpackage
+ git status
+
+ echo 0
fatal: Not a git repository (or any parent up to mount point /build)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
+ RGIT=0

这种方式称为下标。 它被另一个脚本调用。

第一个脚本

#!/bin/sh -x
#set -e

#do stuf 

. ../../../tools/second_script.sh

第二个脚本

#!/bin/sh -x
set -e

#do stuf 

RSVN=`svn status &> /dev/null; echo $?`
RGIT=`git status &> /dev/null; echo $?`

你知道为什么会这样吗?

2 个答案:

答案 0 :(得分:3)

在命令执行之前,该变量被shell 替换。这样做:

svn status &> /dev/null; RSVN=$?
git status &> /dev/null; RGIT=$?

实际上,不要习惯使用ALL_CAPS_VARS:有一天你会说PATH=$(something),然后想知道为什么你的脚本坏了。

答案 1 :(得分:0)

我现在跟随另一个aproch,这是我需要的,但是使用退出代码是最糟糕的解决方案。

绝对:

RSVN=`svn status &> /dev/null; echo $?`
RGIT=`git status &> /dev/null; echo $?`

使用:

RSVN=`svn status 2>&1 | grep "is not a working copy" | wc -l`
RGIT=`git status 2>&1 | grep "Not a git repository"  | wc -l`