具有特定错误代码的失败的Bash内置命令?

4

我认为我可以自己写这个

unrollme-dev-dan:~ Dan$ echo 'exit $@' > fail
unrollme-dev-dan:~ Dan$ chmod +x fail
unrollme-dev-dan:~ Dan$ ./fail 42
unrollme-dev-dan:~ Dan$ echo $?
42

有内置的方法可以做到这一点吗?当然,exit无法使用,因为它会退出当前进程,而不是创建一个子进程并从该进程退出。我发现test是最简单的方法,只需获得01>作为返回代码。
类似于http://httpstat.us/,我需要对特定错误代码进行单元测试。这在谷歌上非常难以搜索,因为大多数结果都是处理错误,而不是引起错误。
2个回答

4

您可以轻松创建一个子进程并通过返回代码退出:

( exit 42 )

我一直都好奇括号除了搞乱我的grep之外还有什么作用,有时候我还忘了加引号。 - djechlin
括号会创建一个子shell,这个子shell实际上是一个子进程(除了在ksh中有一些奇怪的例外)。它是一个新的进程,可以保护你免受各种影响父进程的方式,但对于这种用例来说,它只比函数稍微昂贵一点。 - kojiro

2

在POSIX中似乎没有这样的内置功能。如果有非标准实用程序,我不知道它,但是您可以编写一个简单的shell函数,例如

fail() {
  return $(( $1 ))
}

算术表达式可以防止非数字值。您可以这样写:
a=6
fail a

如果您只写了return $1,您将会从shell中得到一个错误。相反,如果您写成exit 6,您将会得到一个退出状态为6的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接