bash:如何打印diff命令输出?

bash:如何打印diff命令输出?,bash,diff,Bash,Diff,我想使用diff作为if语句条件,但也要将diff输出到stdout。但是,当我将diff作为条件时,它不会运行命令/显示输出: if [ "diff -rq dir1 dir2" != "" ] then echo "there are differences" exit 5 fi 当两个目录有差异时,我想让它输出差异,但它不打印差异,只输出有差异 如果我在If条件的外部运行diff-rq dir1 dir2,它将仅在dir1:xyz.txt中打印。我知道我可以在if语句th

我想使用diff作为if语句条件,但也要将diff输出到stdout。但是,当我将diff作为条件时,它不会运行命令/显示输出:

if [ "diff -rq dir1 dir2" != "" ]
then
    echo "there are differences"
    exit 5
fi
当两个目录有差异时,我想让它输出差异,但它不打印差异,只输出
有差异


如果我在If条件的外部运行
diff-rq dir1 dir2
,它将仅在dir1:xyz.txt中打印
。我知道我可以在if语句
then
中编写命令
diff-rq dir1 dir2
,但是有更好的方法吗?

您正在比较文本字符串“diff-rq dir1 dir2”和文本字符串“”。显然,这些不匹配,如果
条件满足,您的将运行回显

要实现您想要的功能,请利用
diff
在且仅在文件不同时返回非零的事实:

if ! diff -rq dir1 dir2; then
    echo "they differ"
    exit 5
fi

不要费心比较
diff
的输出是否为空:这不是UNIX的方式。

如果[!diff-rq dir1 dir2]写
是否正确?我试图把所有的条件都放在括号里,但并不总是有效。@book
[
不是shell语法,它只是一个有趣的名称,用于执行简单比较和测试的程序。你可以在
/usr/bin中找到它/[
。在这种情况下,您希望运行
diff
程序。@book有些人会认为使用
[
根本不对!如果您拼写
test
,您将避免因相信
[
是shell语法的一部分。如果出于某种原因,您不喜欢使用
test
并想要一个属于语法一部分的运算符,请使用
[[
,但请注意,该运算符的用法未经标准指定。(也就是说,某些shell无法识别它,因此,如果您使用它,您的脚本将限制为那些能够识别它的shell。)