我有一个需要至少一个参数的脚本。如果参数不正确,我显然会返回非零退出代码。
我决定在没有参数的情况下打印使用说明,但我不确定退出代码。应该是
0
(成功)可以以任何一种方式提出争论。是否推荐了一些选项?
答案 0 :(得分:3)
这取决于您是否希望脚本的调用者以编程方式知道为什么失败。
例如,如果它只会由人类运行,您只需返回1
并依赖错误文本通知他们。
你甚至可以甚至返回零,无论你是否只想要一个人轻易知道(通过输出)它是否失败但是我会考虑这个非常糟糕的形式 - 微软在过去他们的一些命令没有设置%errorlevel%
,使得非常难以让脚本弄清楚它是否有效。
即使你决定不说明失败的原因,你至少应该指出 它失败了。
如果您希望程序轻松找出原因失败,请为每种可辨别的错误类型返回不同的代码。
答案 1 :(得分:2)
将控制权返回给父进程的任何Unix命令都会返回一个代码,编号介于0和255之间。
成功传统上以exit 0
表示; failure 通常用非零退出代码表示。该值可以指示失败的不同原因。
所以你所遇到的另一个案例是你的程序没有成功完成,应该被视为返回正确的错误代码而不是 0。
另请注意,传统的Unix系统调用不会发出空参数的错误代码,必须明确捕获它们。参数列表有一个太长(E2BIG
)和无效参数(EINVAL
)。
答案 2 :(得分:0)
这是我决定使用的,主要基于Inians answer和显示的here保留的退出代码。
我决定重新使用/usr/include/asm-generic/errno-base.h
1 中定义的退出代码。没有什么适合“参数太少”的,所以我从64-113范围中选择了第一个。
# Error codes
E2BIG=7
EINVAL=22
E2SMALL=64
NAME="my-script"
USAGE=$(cat << END
the help text
RETURN CODES
$NAME has the following return codes:
0 success
$E2BIG Argument list too long
$EINVAL Invalid argument
$E2SMALL Argument list too short
END
)
# This script requires exactly one argument. If less are provided it prints
# the USAGE instructions
if [ ${#} -lt 1 ] ; then
printf '%s\n' "${USAGE}"
exit $E2SMALL
fi
if [ "${1}" = "-h" ] || [ "${1}" = "--help" ] ; then
printf '%s\n' "${USAGE}"
exit 0
fi
if [ ${#} -gt 1 ] ; then
printf '%s\n' "${USAGE}"
exit $E2BIG
fi
这有点冗长,但是如果不正确地调用脚本,至少存在正确定义的错误代码。
1 这可能值得商,,但是由于代码已经定义好了...