在diff
手册页上,我找到了这些退出值:
0 No differences were found.
1 Differences were found.
>1 An error occurred.
对于不同的错误,是否存在高于 1 的不同退出值?
这取决于你的diff
命令。我的(GNU diffutils 3.0)说:
退出状态
0
表示没有发现差异,1
表示发现了一些差异,2
表示有问题。通常,不同的二进制文件算作麻烦,但这可以通过使用-a
or--text
选项或-q
or--brief
选项来改变。
根据您使用的 diff 版本,可能存在或可能没有不同的错误代码。如果我没记错的话,标准 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 脚本突然失败。这就是为什么有一个单独的awk
和nawk
命令和一个单独的grep
和egrep
命令。
*根据@chus 的评论更新。
在我的情况下diff
返回 127。搜索它并在 tldp.org “具有特殊含义的退出代码”中找到它
127 “command not found” - 非法命令 - $PATH 可能有问题或拼写错误。
我使用了不正确的路径来区分。:)
字体:高级 Bash 脚本指南。