Bash 差异的错误退出值是什么?

Bash 差异的错误退出值是什么?,bash,shell,diff,exit-code,Bash,Shell,Diff,Exit Code,在diff手册页上,我找到了以下退出值: 0 No differences were found. 1 Differences were found. >1 An error occurred. 对于不同的错误,是否存在高于1的不同退出值?这取决于您的diff命令。Mine(GNU diffutils 3.0)说: 退出状态为0表示未发现差异,1表示存在一些差异 发现差异,2表示有问题。通常情况下,不同的 二进制文件算是麻烦,但这可以通过使

diff
手册页上,我找到了以下退出值:

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

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

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

退出状态为
0
表示未发现差异,
1
表示存在一些差异 发现差异,
2
表示有问题。通常情况下,不同的 二进制文件算是麻烦,但这可以通过使用
-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脚本突然失败。这就是为什么有一个单独的
awk
nawk
命令和一个单独的
grep
egrep
命令


*根据@chus的评论进行更新。

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

127“未找到命令”-非法的_命令-可能存在$PATH问题或键入错误

我使用了不正确的差异路径:)


Font:.

同意,我检查了源代码,唯一的退出代码是exit_SUCCESS、exit_FAILURE(都在stdlib.h中定义)和exit_TROUBLE,在src/diffutils-3.0/system.ht中定义,'--text'选项会在有两个(大)不同的二进制文件时弄乱我的标准输出。@sid_com,试着在你的终端中盲输入
echo^V^[c
echo-[control-V]-[escape]-c
)或
stty sane
。@Frédéric Hamidi:我不得不滚动很多次(使用
diff-r
时),感觉很糟糕.Edit:我正在将
diff
与perls
IPC::System::Simple::System
一起使用,它允许我指定一系列被视为可接受的退出值。请注意:
$?
在执行
if[$?eq 0]
后更新,因此
elif
评估与diff输出无关。“那里[可能或可能]根据您使用的
diff
的版本,不会有不同的错误代码。”。因此,您不能假设2,但0和1是安全的。@Davidermann在写此答案时Mac使用的BSD版本的
diff
命令中,diff手册页将错误代码列为0、1或2。Mac现在使用GNU的diffutils,因此手册页中的错误代码现在是0、1和>1。所有Unix
diff
命令都会这样说
0
表示文件匹配,1表示发现差异。之后,文档不同。与diff返回值主题无关,但在macOS上的“elif”行之后应该有一个“then”,diff手册页未定义输出值