在bash中,有没有相当于“错误信息”

在perl中,你可以用die "some msg"退出一个错误消息。 在bash中是否有等价的单个命令? 现在,我正在使用命令来实现这个: echo "some msg" && exit 1

你可以很容易地推出自己的:

 die() { echo "$*" 1>&2 ; exit 1; } ... die "Kaboom" 

这是我正在使用的。 放入图书馆太小,所以我必须input数百次。

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

用法: die 127 "Syntax error"

这是一个非常接近perl的“死”function(但function名称):

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

和bash的方式如果内置函数失败(带函数名)

 function die { local message=$1 [ -z "$message" ] && message="Died" echo "${BASH_SOURCE[1]}: line ${BASH_LINENO[0]}: ${FUNCNAME[1]}: $message." >&2 exit 1 } 

所以,Bash将所有需要的信息保存在几个环境variables中:

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

是的,这几乎是你如何做到的。

你可以使用分号或换行符而不是&&,因为你想退出是否成功回声(虽然我不知道什么会使它失败)。

在shell中编程意味着使用很多小命令(一些内置命令,一些小程序)来完成一件事情,并将它们与文件redirect,退出代码逻辑和其他粘连连接起来。

如果您习惯于使用函数或方法来完成所有事情的语言,但是您已经习惯了,那看起来会很奇怪。

 # echo pass params and print them to a log file wlog(){ # check terminal if exists echo test -t 1 && echo "`date +%Y.%m.%d-%H:%M:%S` [$$] $*" # check LogFile and test -z $LogFile || { echo "`date +%Y.%m.%d-%H:%M:%S` [$$] $*" >> $LogFile } #eof test } # eof function wlog # exit with passed status and message Exit(){ ExitStatus=0 case $1 in [0-9]) ExitStatus="$1"; shift 1;; esac Msg="$*" test "$ExitStatus" = "0" || Msg=" ERROR: $Msg : $@" wlog " $Msg" exit $ExitStatus } #eof function Exit