2013-09-27 127 views
1

我在看这段代码:这看起来很愚蠢,但/ dev/null是否有返回值?

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

除非它的输出定向到/ dev/null的不DIFF评估假的?

+4

'diff file1 file2>/dev/null'的值是'diff'的返回值。你为什么期望'diff'的返回值根据你重定向输出的位置而不同? – lurker

+0

我不确定。问题是diff file1 file2应该只是返回0,如果文件是相同的权利?所以我不明白他们为什么将输出重定向到dev/null – hahahaha

+0

这段代码只关心文件是否相同。 'diff'输出所有的差异。如果你不想看到差异,但只是想知道有什么不同,你可以将输出发送到'/ dev/null'。这就是你发送你不关心的输出的地方。返回值是分开的,而不是“diff”的“输出”。 – lurker

回答

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进行I/O重定向。但是,使用diff并隐瞒差异是合法的。

+0

还要感谢,你是如何格式化代码的? – hahahaha

+0

多年的练习:)在编辑框中,按照您希望的方式输入代码(或者,更好的方法是在编辑器中准备好,然后复制并粘贴到编辑框中)。避免在输入中使用任何选项卡;他们搞乱了布局。然后选择要作为代码的材料并按**上面的{}'**按钮;将选定的材质缩进4个空格,然后MarkDown语言将其视为'代码'并将其格式化为带有灰色背景的固定宽度字体。您也可以使用编辑框上方的帮助。或者,您可以在每行的开头输入四个空格的代码。 –

+0

说'diff -q file1 file2'不需要重定向到'/ dev/null'。 – devnull

3

不,shell正在测试返回值为diff,而不是写入标准输出的内容。返回值是不同的。它们是程序退出时返回的状态代码。所以,你指导输出的地方并不重要(如果有的话)。并且没有/dev/null没有返回值。这不是一个你运行的程序 - 它只是发送你不想存储的数据的地方。

+0

难道你不会把这个“某处”称为一个*设备*吗? – ErikE

+0

这是我亲自调用'/ dev/null'的最后一件事情之一。 – jedwards

+0

@ErikeE是的,我会在技术上,但我喜欢把它想成一个黑洞。更多的特殊文件忽略写入到它的任何数据。 – paddy

1

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