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
与perlsIPC::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。所有Unixdiff
命令都会这样说0
表示文件匹配,1表示发现差异。之后,文档不同。与diff返回值主题无关,但在macOS上的“elif”行之后应该有一个“then”,diff手册页未定义输出值