【问题标题】:Find line number of function call from sourcing file从源文件中查找函数调用的行号
【发布时间】:2019-03-10 04:29:13
【问题描述】:

我正在尝试找到一种方法来找出调用函数的文件和行号。该函数位于我的脚本所获取的库文件中。

文件 1:

$source file2
$warn_me "Error: You didn't do something"

文件2:

$function warn_me() {
$  message=????
$  echo ${message}
$}

期望的输出: $: file1:Line 2: Error: You didn't do something

函数调用已经在许多文件中发生了很多次,所以我试图找到一种方法来做到这一点而不改变它。

以前,warn_me 函数是在每个使用它的文件中定义的,它的处理方式如下:

$local message="$BASH_SOURCE:(""${BASH_LINENO}): ""$*"

【问题讨论】:

标签: bash logging scripting


【解决方案1】:

您似乎在寻找caller

$ cat h.sh 
#! /bin/bash
function warn_me() {
  echo "$@"
  caller 
}
$ cat g.sh 
#!/bin/bash
source h.sh
warn_me "Error: You didn't do something"
$ . g.sh
Error: You didn't do something
3 g.sh

【讨论】:

  • 谢谢,我最终将这一行替换为: $local message="$BASH_SOURCE[1]:(""${BASH_LINENO}): ""$*"
  • 是否存在caller优于BASH_SOURCE[x]BASH_LINENO[x-1]FUNCNAME[x]的极端情况?
【解决方案2】:

受@nosid 和@Wrikken 的启发,我编写了一个小函数来将当前堆栈跟踪放入一个名为$STACK 的变量中。向用户输出发生错误的位置可能很有用。太糟糕了 bash 没有内置的 printStackTrace...希望有人可以在他们的项目中找到它。

function get_stack () {
   STACK=""
   local i message="${1:-""}"
   local stack_size=${#FUNCNAME[@]}
   # to avoid noise we start with 1 to skip the get_stack function
   for (( i=1; i<$stack_size; i++ )); do
      local func="${FUNCNAME[$i]}"
      [ x$func = x ] && func=MAIN
      local linen="${BASH_LINENO[$(( i - 1 ))]}"
      local src="${BASH_SOURCE[$i]}"
      [ x"$src" = x ] && src=non_file_source

      STACK+=$'\n'"   at: "$func" "$src" "$linen
   done
   STACK="${message}${STACK}"
}

更新:我修正了一个错字并添加了一个错误消息参数。所以函数的第一个参数是要添加到堆栈跟踪的错误消息。顺便说一句,如果您的脚本在bash 的标准输入上提供(在大多数情况下是个坏主意),那么第一个位置将会丢失。如果需要,然后在for 循环中,将其更改为i&lt;$stack_size + 1。但正如我所说,将您的脚本提供给 bash 的标准输入 here's why 并不是一个好主意。

更新 2:我发现我有一个关于此的 older answer。想更好地将代码的更新版本保存在一个地方。所以决定做一个gist。随时提出对要点的改进建议。如果发生任何更改,我会尽量保持更新此答案,但我不能保证。

【讨论】:

    【解决方案3】:

    可用于此目的的三个数组变量:

    • FUNCNAME
    • BASH_SOURCE
    • BASH_LINENO

    查看以下答案了解更多详情:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多