1

我习惯于SLF4J在 Java 和loggingPython 中使用函数名称 行号作为输出格式的字段。

强调:行号

我可以在 Bash 中得到类似的东西吗?

目标:构建一个log_error通用函数以从我的(巨大的)脚本调用,输出错误源的严重级别、函数名称和行号。

预期用途:

log_error "INFO: my info" ... # called from within my_function at line 20

预期输出:

[INFO] my_function@20 my info

这样的事情有可能吗?

4

3 回答 3

2

使用$LINENO:每次引用此参数时,shell 都会替换一个十进制数字,表示脚本或函数中的当前连续行号(从 1 开始)。

于 2013-03-10T07:18:32.577 回答
1

你最好使用BASH_LINENO数组。这是Bash 手册的摘录:

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

这是 Bash 的综合日志记录实现:

https://github.com/codeforester/base/blob/master/lib/stdlib.sh

于 2019-03-31T04:56:20.810 回答
0

希望下面的例子有shopt -s expand_aliases帮助alias

尝试.sh

#! /usr/bin/env bash

shopt -s expand_aliases

# =============================================================
# Define the logger
# =============================================================
alias logger='logger_function [${BASH_SOURCE##*/}] [$FUNCNAME] [$LINENO] '

logger_function()
{
    echo $@
}

# =============================================================
# Use the logger
# =============================================================
my_function()
{
    logger "hello world!"
}

my_function

测试结果:GNU bash,版本 3.2.57(1)-release

$ ./try.sh
[try.sh] [my_function] [20] hello world!

考虑到问题的重点是:line number,所以在这个例子中,没有使用完全相同的问题输入和输出。

但为了提供更多信息,日志记录实用程序定义添加了:

  • $BASH_SOURCE
  • $FUNCNAME
  • $LINENO

因此,它可以打印文件名、函数名和行号。

关于alias这里的用法,它看起来像但实际上不能与 C 宏相比,根据:https ://tldp.org/LDP/abs/html/aliases.html

于 2022-02-16T09:43:58.387 回答