1

我正在看这段代码:

if diff file1 file2 > /dev/null;                   
then echo "same files!"  `  
else ..... 

除非 diff 的输出被定向到 /dev/null,否则不会被评估为假?

4

3 回答 3

4

说明差异的最简单方法是通过示例:

$ if diff file1 file2
> then echo The same
> else echo Different
> fi
2c2
< bb
---
> ee
Different
$ if diff file1 file2 > /dev/null
> then echo The same
> else echo Different
> fi
Different
$ diff -u file1 file2
--- file1   2013-09-26 19:44:06.000000000 -0700
+++ file2   2013-09-26 19:44:19.000000000 -0700
@@ -1,4 +1,4 @@
 aa
-bb
+ee
 cc
 dd
$ 

在不将输出发送到的情况下/dev/null,您会看到 的标准输出diff和测试退出状态的适当操作diff。当您将 的输出发送diff到 时/dev/null,您根本看不到diff输出,但您仍然可以通过测试 的退出状态获得适当的操作diff。如果您正在编写脚本,您通常不希望用户看到实际差异;知道文件不同就足够了。

还有其他工具可用于该工作;特别是,cmp -s file1 file2只返回一个退出状态,指示文件是相同还是不同(它可以用于二进制文件,而不仅仅是文本文件)。您不需要使用cmp. 但是,使用diff和隐藏差异是合法的。

于 2013-09-27T02:52:00.277 回答
3

不,shell 正在测试 的返回值diff,而不是它写入标准输出的内容。返回值不同。它们是程序退出时返回的状态码。因此,您将输出指向何处(如果有的话)并不重要。并且 no/dev/null没有返回值。它不是您运行的程序 - 它只是发送您不想存储的数据的地方。

于 2013-09-27T02:34:07.570 回答
1

/dev/null没有返回值,因为它不是执行的二进制文件。当您不关心输出时,它只是一个重定向数据的地方。

于 2013-09-27T02:36:09.043 回答