linux shell lineno,如何获取失败的Bash命令的实际行号?

在提出一种在我的

Bash脚本中捕获错误的方法的过程中,我一直在试验“set -e”,“set -E”和“trap”命令.在这个过程中,我发现了在函数上下文中如何评估$LINENO的一些奇怪行为.首先,这是我正在尝试记录错误的简化版本:

#!/bin/bash

set -E

trap 'echo Failed on line: $LINENO at command: $BASH_COMMAND && exit $?' ERR

现在,根据故障发生的位置,行为会有所不同.例如,如果我遵循以上内容:

echo "Should fail at: $((LINENO + 1))"

false

我得到以下输出:

Should fail at: 6

Failed on line: 6 at command: false

一切都如预期.第6行是包含单个命令“false”的行.但是如果我将失败的命令包装在一个函数中并像这样调用它:

function failure {

echo "Should fail at $((LINENO + 1))"

false

}

failure

然后我得到以下输出:

Should fail at 7

Failed on line: 5 at command: false

如您所见,$BASH_COMMAND包含正确的失败命令:“false”,但$LINENO将“失败”函数定义的第一行报告为当前命令.这对我来说毫无意义.有没有办法获得$BASH_COMMAND中引用的行的行号?

这种行为可能特定于旧版本的Bash.我暂时停留在3.2.51.如果在以后的版本中行为发生了变化,那么知道是否有一种解决方法可以获得我想要的值3.2.51仍然是一件好事.

编辑:我害怕有些人感到困惑,因为我把我的例子分成了几块.让我试着澄清一下我拥有什么,我得到了什么,以及我想要什么.

这是我的脚本:

#!/bin/bash

set -E

function handle_error {

local retval=$?

local line=$1

echo "Failed at $line: $BASH_COMMAND"

exit $retval

}

trap 'handle_error $LINENO' ERR

function fail {

echo "I expect the next line to be the failing line: $((LINENO + 1))"

command_that_fails

}

fail

现在,我期望的是以下输出:

I expect the next line to be the failing line: 14

Failed at 14: command_that_fails

现在,我得到的是以下输出:

I expect the next line to be the failing line: 14

Failed at 12: command_that_fails

但第12行不是command_that_fails.第12行是函数失败{,这有点不太有帮助.我还检查了${BASH_LINENO [@]}数组,它没有第14行的条目.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值