&> /dev/null 的“对立面”

Pao*_*olo 2 bash if-statement dev-null

我使用以下脚本与文件夹进行比较:

if diff "/home/folder1/" "/home/folder2/" &> /dev/null ; then
    echo "Files in the two folders are the same"    
else
    echo "Files in the two folders are NOT the same"
fi
Run Code Online (Sandbox Code Playgroud)

是否有一个简短的方法来解释“&> /dev/null”实际上是做什么的,它是否返回一个布尔值真/假?

我的主要问题是:相反会是什么?我的意思是,假设我希望“if diff”问题是“两个文件夹的内容不一样吗?”

Alf*_*lfe 5

&> /dev/null将 stdout 和 stderr 输出重定向到/dev/null,有效地抑制了进程的所有输出。程序的退出代码(数字“结果”,通常表示“成功”(0)或“失败”(任何其他数字))不受此影响。

要反转条件 (the diff),只需插入一个感叹号,说明一个not运算符:

if ! diff "/home/folder1/" "/home/folder2/" &> /dev/null ; then
...
Run Code Online (Sandbox Code Playgroud)

当(且仅当)它没有发现任何差异时,该diff工具总是以退出值终止0。如果有差异,1就是退出值;如果有问题(I/O 错误或类似的事情),2是退出值。该if壳解释退出值的0真实和所有其他值是假的(介意,因为这是其他编程语言的完全相反!)。

  • 我个人会尽量避免那些丑陋的 `!` 变体,而是切换 `then` 和 `else` 块以达到相同的效果。如果我没有这两个块,那么我什至不使用“if”,因为我可以通过使用“diff ... && echo“then block!””或“diff ... ||”来实现相同的目的 echo "else block!"` (在这种情况下我倾向于将 `||` 读作_otherwise_)。使用重定向使其看起来像这样: `diff ... &>/dev/null || echo "else block!"` 如果您的块较大,您可以使用大括号将多个命令分组。 (2认同)