2014-05-06 79 views
1

在命令行上,用在两个文件不同,命令检查DIFF退出状态在脚本

echo $? 

报告回差异后“1”。当我尝试在脚本中相同,具体如下:

echo "` diff $F1 $F2`" 
rv=$? 
if [[ $rv == 1 ]] 
then  
    echo "failed"  
fi   

然后我从来不打印“失败”(即使是不同的文件)。请注意,这是bash shell的,所以语法应该罚款(例如,如果我检查“0”代替,它总是打印)。

我如何检查是否diff命令上发现差异和工艺条件?

这是Ubuntu的12.04下方。

+0

使用'cmp',而不是'diff'如果你只关心数量在返回代码。 – RedX

+2

和'回声$(DIFF)'返回从'echo'退出代码,而不是从'diff'。 – RedX

+0

@RedX:你的第二个评论回答了为什么它不起作用,谢谢。但我想首先打印差异,但也要记录多少次比较失败。你看到一个简单的方法来做到这一点? – gnometorule

回答

2

您可能想要这样做。

echo "`diff $F1 $F2`" 
diff $F1 $F2 > /dev/null 2>&1 
rv=$? 
... 

因为$?是由echo成功执行被置为0。

如果你不想跑两次diff你能做到这一点太..

diff $F1 $F2 > /tmp/thediff 2>&1 
    if [ $? != 0 ] 
    then 
     cat /tmp/thediff 
    fi 
+1

您运行diff两次 – ceving

+1

只需删除''' –

+0

@ꜱᴀᴍᴏᴛʜ然后回显将不打印结果 – ceving

3

这似乎是因为,在你的脚本,$?是你echo线的返回状态(不是以前的程序),和回声可能会一直工作,并返回0

4

你没有看到从diff的返回值,因为最后一个命令运行实际上是echo和你”重新看到它的回报价值。你应该能够实现与下面的代码所需的效果(捕捉,然后呼应的diff输出是不必要的 - 只是让它写到标准输出):

diff $F1 $F2 
rv=$? 
if [[ $rv == 1 ]] 
then  
    echo "failed"  
fi 

另外,还要注意diff返回一个值大于一个误差(0表示相同的文件,1表示不同的文件)。您可能需要检查并处理该案件。

+1

谢谢,但我还需要打印差异;所以@RedCricket的回答正是我所需要的。 – gnometorule

+2

'echo'\'cmd \'''构造是毫无意义的。你正在捕获'cmd'写入'stdout'的内容,并立即将其写入'stdout'。正如所写的,它不会完成任何操作(除非 - 如您发现的那样 - 无法获得'cmd'的返回值)。 –

+0

@RedCricket同意,尽管RedX的答案也有(部分地)解决计数差异要求的优点。你可以通过更新你的答案来解决这个问题,用一个指向这个(也是RedX的)答案的序言。 – mklement0

5

从您的评论:

但我想,首先打印的差异,也跟踪了许多比较如何失败。

我不知道diff是否输出退出代码中差异的数量。我想不是。但是,你可以指望,也许行......

这里是你如何保存退出代码和计数不同的线路

var=$(diff "$F1" "$F2") 
#store diff exit code 
exit_code=$? 
# remember that this is not the same as count of differences 
lines_output_by_diff=$(wc -l <<< "$var") 

echo "$var" 

if (($exit_code == 0)); then 
    echo "same" 
else 
    echo "not same" 
fi 
+0

非常好!这比我想要的还要多。差异是二元的(正如你可能知道的):1 - 差异,0 - 无。 – gnometorule

+2

@gnometorule:如果用'grep -c'^ [0-9]'替换'wc -l',你会得到实际的_difference count_。 – mklement0