我正在尝试检查文件夹是否是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 $?`
你知道为什么会这样吗?
答案 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`