shell diff的错误退出值是什么?

3qpi33ja  于 2023-02-24  发布在  Shell
关注(0)|答案(4)|浏览(149)

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

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

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

piah890a

piah890a1#

这取决于你的diff命令。我的(GNU diffutils 3.0)是这样的:
0的退出状态表示未找到差异,1表示找到一些差异,2表示有问题。通常,不同的二进制文件被视为有问题,但可以使用-a--text选项,或者-q--brief选项更改此状态。

fdx2calv

fdx2calv2#

根据您使用的diff版本的不同,可能会有,也可能没有不同的错误代码。如果我没记错的话,标准的BSD diff总是返回0、1或2的退出代码。
然而,手册页并没有列出diff可能做的所有事情,而是列出了可以用来使用diff命令的文档。在shell脚本中,我想知道文件是否匹配(exit = 0)。然而,在我的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的评论更新。
oiopk7p5

oiopk7p53#

在我的例子中,diff返回127。搜索它并在tldp.org“具有特殊含义的退出代码”中找到它
127“找不到命令”-非法命令-可能是$PATH或输入错误。
我使用了一个不正确的路径进行比较。:)
字体:Advanced Bash-Scripting Guide

dgiusagp

dgiusagp4#

macOS使用与GNU diff类似的返回代码,但明确定义了2作为错误情况的返回代码:
退出状态0表示未发现差异,1表示发现一些差异,2表示有问题。
--摘自info diff的“调用diff”一节,在macOS 12.6.3下

相关问题