diff的错误退出值是什么?

时间:2011-08-07 07:05:45

标签: bash shell diff exit-code

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

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

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

3 个答案:

答案 0 :(得分:57)

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

  

退出状态0表示未发现任何差异,1表示一些差异   发现了差异,2意味着麻烦。通常,不同   二进制文件算作麻烦,但这可以通过使用来改变   -a--text选项,或-q--brief选项。

答案 1 :(得分:7)

可能,或者根据您使用的差异版本,可能没有不同的错误代码。如果我没记错的话,标准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的评论更新。

答案 2 :(得分:3)

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

127“命令未找到”illegal_command $ PATH或拼写错误可能出现问题。

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

字体:tldp.org/LDP/abs/html/exitcodes.html