不同的退出代码

时间:2013-09-17 16:13:24

标签: bash shell exit-code

我正在尝试从我的subversion命令中获取版本号,以便我可以检查我们是否在bash脚本中加载了write subversion模块。

交互式地,这是一个使用示例:

> svn --version | head -n1 | grep -q '1.7'; echo $?
0

但是,当我在脚本中放置相同的行(而不是其他内容)并运行脚本时:

> ./setup_svn.sh
1

此外,该脚本的运行速度明显快于交互式shell命令。有没有人知道我可能会遗漏什么来解释这个结果?


修改

事实证明我的交互式bash脚本使用了错误的svn命令。不确定为什么,但我认为这可能是Unix StackExchange的一个问题。

我们的工作站上的模块系统几乎可以肯定,我以交互方式运行:

> module list
Currently Loaded Modulefiles:
...
12) subversion/1.7.7    
> which svn
/usr/bin/svn
> svn --version
svn, version 1.7.7 (r1393599)
...

在脚本中运行,我得到:

> ./setup_svn.sh
Currently Loaded Modulefiles:
...
12) subversion/1.7.7    
/usr/bin/svn
svn, version 1.6.17 (r1128011)
...

进一步修改

似乎如果我开始一个新的shell,我也会遇到同样的问题:

> bash
> module list
Currently Loaded Modulefiles:
...
12) subversion/1.7.7
> svn --version
svn, version 1.6.17 (r1128011)

我想我会找出我们的模块系统对环境做了什么,并用它来解决出错的问题。

2 个答案:

答案 0 :(得分:1)

我知道它不会纠正这个问题,但我认为head命令是没用的。您可以使用--quiet选项。

$ svn --version --quiet
1.7.5

编辑:

如果是konsolebox提到的分号问题,您也可以使用以下语法:

echo $(svn --version --quiet | grep -q '1.7')$?

答案 1 :(得分:0)

shell可能是如何处理分号的。尝试分为两行。

#!/bin/sh
svn --version | head -n1 | grep -q '1.7'
echo "$?"

如果您还在使用bash,请确保未启用pipefail:

#!/bin/bash
shopt -u -o pipefail
svn --version | head -n1 | grep -q '1.7'
echo "$?"