在bash中,是否有相同的模具"错误信息"

PJx*_*PJx 66 bash shell

在perl中,您可以使用错误消息退出die "some msg".在bash中是否有相同的单个命令?现在,我正在使用命令实现此目的:echo "some msg" && exit 1

Kei*_*son 71

你可以轻松地自己动手:

die() { echo "$*" 1>&2 ; exit 1; }
...
die "Kaboom"
Run Code Online (Sandbox Code Playgroud)

  • @WilliamPursell:您可以使用`printf%s"$ {@ + $ @ $'\n'}"` - 换句话说,如果存在,则打印参数后跟换行符. (4认同)

tri*_*eee 27

这就是我正在使用的.它太小了,无法放入图书馆,所以我必须输入数百次......

warn () {
    echo "$0:" "$@" >&2
}
die () {
    rc=$1
    shift
    warn "$@"
    exit $rc
}
Run Code Online (Sandbox Code Playgroud)

用法: die 127 "Syntax error"


小智 11

这是perl的"die"非常接近的函数(但是带有函数名):

function die
{
    local message=$1
    [ -z "$message" ] && message="Died"
    echo "$message at ${BASH_SOURCE[1]}:${FUNCNAME[1]} line ${BASH_LINENO[0]}." >&2
    exit 1
}
Run Code Online (Sandbox Code Playgroud)

如果内置函数失败,则使用bash方式死亡(使用函数名称)

function die
{
    local message=$1
    [ -z "$message" ] && message="Died"
    echo "${BASH_SOURCE[1]}: line ${BASH_LINENO[0]}: ${FUNCNAME[1]}: $message." >&2
    exit 1
}
Run Code Online (Sandbox Code Playgroud)

因此,Bash将所有需要的信息保存在几个环境变量中:

  • LINENO - 当前执行的行号
  • FUNCNAME - 调用函数堆栈,第一个元素(索引0)是当前函数,第二个(索引1)是调用当前函数的函数
  • BASH_LINENO - 调用行号堆栈,调用相应的FUNCNAME
  • BASH_SOURCE - 源文件数组,其中存储了对应的FUNCNAME

  • 您可以使用`$ {1-Died}来完全避免使用局部变量 - 使用它,您甚至可以传入一个空字符串,它将按预期工作. (5认同)

bon*_*dog 5

是的,你就是这么做的。

您可以使用分号或换行符而不是 &&,因为无论 echo 是否成功,您都想退出(尽管我不确定什么会导致它失败)。

在 shell 中编程意味着使用大量的小命令(一些内置命令,一些小程序)来很好地完成一件事,并将它们与文件重定向、退出代码逻辑和其他粘合剂连接起来。

如果您习惯使用函数或方法完成所有操作的语言,这可能看起来很奇怪,但您已经习惯了。

  • 使用 `{}` 而不是 `()` 来避免子 shell 问题。另外,最好将错误发送到 stderr 而不是 stdout:`CMD1 || { echo '错误消息'>&2; 1号出口;}; 命令2;命令3` (2认同)