69

diff手册页上,我找到了这些退出值:

    0     No differences were found. 
    1     Differences were found.
   >1     An error occurred.

对于不同的错误,是否存在高于 1 的不同退出值?

4

3 回答 3

78

这取决于你的diff命令。我的(GNU diffutils 3.0)说:

退出状态0表示没有发现差异,1表示发现了一些差异,2表示有问题。通常,不同的二进制文件算作麻烦,但这可以通过使用 -aor--text选项或-qor--brief选项来改变。

于 2011-08-07T07:09:23.470 回答
9

根据您使用的 diff 版本,可能存在或可能没有不同的错误代码。如果我没记错的话,标准 BSD diff 总是返回 0、1 或 2 的退出代码。

但是,手册页并没有列出 diff 可能执行的所有操作,而是您可以用于使用 diff 命令的文档。在 shell 脚本中,我想知道文件是否匹配(exit = 0)或不匹配(exit = 1)。但是,在我的 shell 脚本中,我还想知道 diff 命令本身不起作用。

diff $file1 file2 > /dev/null 2>&1
error=$?
if [ $error -eq 0 ]
then
   echo "$file1 and $file2 are the same file"
elif [ $error -eq 1 ]
then
   echo "$file1 and $file2 differ"
else
   echo "There was something wrong with the diff command"
fi

想象一下,如果有人告诉我 2 表示 diff 命令失败,但是较新版本的 diff 命令区分了您无法读取的文件(exit = 2)和丢失的文件(exit = 3)。现在,想象一下如果我在早期版本的 diff 命令中执行了以下操作,但$file2不存在:

diff $file1 file2 > /dev/null 2>&1
error=$?
if [ $error -eq 2 ]
then
   echo "There was something wrong with the diff command"
elif [ $error -eq 1 ]
then
   echo "$file1 and $file2 differ"
else
   echo "$file1 and $file2 are the same file"
fi

在上面的代码中,我检查了错误代码 2 和 1,但没有检查 3。因此,我假设文件匹配,而不是检测丢失的文件。

该手册页试图确保将来对操作系统的升级不会导致大多数 shell 脚本突然失败。这就是为什么有一个单独的awknawk命令和一个单独的grepegrep命令。

*根据@chus 的评论更新。

于 2011-08-15T16:47:18.597 回答
2

在我的情况下diff返回 127。搜索它并在 tldp.org “具有特殊含义的退出代码”中找到它

127 “command not found” - 非法命令 - $PATH 可能有问题或拼写错误。

我使用了不正确的路径来区分。:)

字体:高级 Bash 脚本指南

于 2015-12-22T12:15:59.893 回答