【问题标题】:Bash: returning line numbers from a functionBash:从函数返回行号
【发布时间】:2014-01-07 11:57:12
【问题描述】:

我正在尝试在 bash 脚本中实现中止功能,目前它看起来像这样:

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_test 中产生这个

------| ERROR: 2014 Jan Tue 12:50:12 line 007 in /home/user/test.sh |------
Some kind of error

我的问题是:手动给出行号的方法(例如 $2

abort "Some kind of error..."

仍然得到行号?

【问题讨论】:

  • 请不要在标题中添加“[已解决]”。我们已经有很多用于此目的的 UI 元素。

标签: bash function error-handling line-numbers


【解决方案1】:

你应该可以使用 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 的行号。

来自man bash 部分关于BASH_LINENO

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

【讨论】:

  • 酷,正是我想要的。谢谢:D
【解决方案2】:

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

awk '/ERROR/{print NR}' logfile

【讨论】:

  • 嗯.. 有趣的解决方案,但它不适用于我的情况。我的脚本中有几个中止调用。运行 awk '/abort/{print NR}' 日志文件将打印我代码中的所有中止语句,但不会打印实际执行的中止语句。
  • @BMW 它没有做 OP 想要的。
猜你喜欢
  • 1970-01-01
  • 2011-07-22
  • 2019-10-20
  • 2013-06-24
  • 2023-03-16
  • 2011-03-15
  • 1970-01-01
  • 2015-09-30
  • 2015-09-29
相关资源
最近更新 更多