Bash:从函数返回行号

Bash:从函数返回行号,bash,function,error-handling,line-numbers,Bash,Function,Error Handling,Line Numbers,我正在尝试在bash脚本中实现一个abort函数,目前看起来如下: function abort { LOGFILE=/var/log/bash_test DATE=$(date "+%Y %b %a %H:%M:%S") printf "\n------| ERROR: %s line %03d in %s |------\n" "$DATE" "$2" "${0}" >> "$LOGFILE" echo "$1" >> "$LOGFILE" } ab

我正在尝试在bash脚本中实现一个abort函数,目前看起来如下:

function abort {
  LOGFILE=/var/log/bash_test
  DATE=$(date "+%Y %b %a %H:%M:%S")
  printf "\n------| ERROR: %s line %03d in %s |------\n" "$DATE" "$2" "${0}" >> "$LOGFILE"
  echo "$1" >> "$LOGFILE"
}

abort "Some kind of error..." $LINENO
这将在/var/log/bash\u测试中产生此结果

------| ERROR: 2014 Jan Tue 12:50:12 line 007 in /home/user/test.sh |------
Some kind of error
我的问题是:手动给出行号的方法(例如$2<$LINENO)既丑陋又重复。是否有办法使此函数自动从函数外部检测$LINENO?这样我才能下达命令

abort "Some kind of error..."

还可以得到行号吗?

使用awk,您可以得到行号。下面的命令将首先搜索关键字“ERROR”,然后导出行号

awk '/ERROR/{print NR}' logfile

您应该能够使用BASH_LINENO:

$ cat test.sh 
my_environment() {
    echo "Stack size: ${#BASH_LINENO[@]}"
    echo "Caller line: ${BASH_LINENO[$((${#BASH_LINENO[@]} - 2))]}"
}
my_environment
$ sh test.sh 
Stack size: 2
Caller line: 5
也就是说,倒数第二个条目将是调用my_environment的行号

manbash
部分关于
bash\u LINENO

一个数组变量,其成员是调用FUNCNAME的每个对应成员的源文件中的行号${BASH_LINENO[$i]}是调用${FUNCNAME[$i]}的源文件(${BASH_source[$i+1]})中的行号(或者${BASH_LINENO[$i-1]}如果在另一个shell函数中引用)。使用LINENO获取当前行号

awk '/ERROR/{print NR}' logfile

陛下有趣的解决方案,但在我的情况下不起作用。我的脚本中有几个中止调用。运行awk'/abort/{print NR}'日志文件将打印我代码中的所有abort语句,但不会打印实际执行的abort语句。@BMW它不执行OP想要的操作。很酷,这正是我想要的。谢谢:请不要在标题中加“[已解决]”。我们已经有了大量的UI元素来实现这一点。