这可能看起来很愚蠢,但/ dev / null是否有返回值?

时间:2013-09-27 02:31:22

标签: bash shell

我正在看这段代码:

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

如果将输出定向到/ dev / null?

,则不将diff评估为false

3 个答案:

答案 0 :(得分: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输出,但您仍然可以通过测试{的退出状态来获得相应的操作{1}}。如果您正在编写脚本,通常不希望用户看到实际的差异;知道文件不同就足够了。

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

答案 1 :(得分:3)

不,shell正在测试diff的返回值,而不是它写入标准输出的内容。返回值不同。它们是程序退出时返回的状态代码。因此,无论您指向输出的位置(如果有的话)都无关紧要。没有/dev/null没有返回值。它不是您运行的程序 - 它只是发送您不想存储的数据的某个地方。

答案 2 :(得分:1)

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