Diff 的错误退出值是什么?

diff手册页中,我发现了以下退出值:

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

对于不同的错误,在1以上是否有不同的退出值?

70008 次浏览

这取决于您的 diff命令:

0的退出状态意味着没有发现差异,1意味着一些 发现了差异,而 2表示有问题。通常情况下,不同的 binary files count as trouble, but this can be altered by using the -a--text选项,或 -q--brief选项。

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

但是,这个 manpage 并没有映射出 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 的评论更新。

In my case diff returned 127. Searched for it and found it in the tldp.org "Exit Codes With Special Meanings"

127“ command not found”-non _ command-$PATH 或输入错误可能导致的问题。

我使用了一个不正确的路径来 diff. :)

字体: 高级 Bash 脚本指南