使用No Arguments调用时退出代码

时间:2018-05-18 07:18:54

标签: bash exit-code

我有一个需要至少一个参数的脚本。如果参数不正确,我显然会返回非零退出代码。

我决定在没有参数的情况下打印使用说明,但我不确定退出代码。应该是

  • 0(成功)
  • 其中一个值[1-125](错误)

可以以任何一种方式提出争论。是否推荐了一些选项?

3 个答案:

答案 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 这可能值得商,,但是由于代码已经定义好了...