Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

caller 0 gives wrong line number in trap handler

Tags:

bash

shell

When using the caller builtin in a Bash trap function, the result of caller 0 gives the wrong line number, always giving 1. For example:

#!/bin/bash
function foo {
    exit 1
}
function bar {
    foo
}
function err {
    (( i = 0 ))
    while caller $i; do
        (( ++i ))
    done
}
trap err EXIT
bar

gives the following output:

1 foo ./test.sh
6 bar ./test.sh
15 main ./test.sh

While the output for i > 0 is correct, when using caller 0 in a trap handler it always seems to give 1 as the line number. Is there any way to get the real line number of the failed function from a trap handler?

like image 286
Xenopathic Avatar asked Dec 09 '14 20:12

Xenopathic


Video Answer


1 Answers

This appears to be a bug introduced sometime after 3.2.57(1)-release:

$ bash -version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin14)
Copyright (C) 2007 Free Software Foundation, Inc.

$ bash ./test.sh
3 foo ./test.sh
6 bar ./test.sh
15 main ./test.sh

$ /usr/local/bin/bash --version
GNU bash, version 4.3.30(1)-release (x86_64-apple-darwin14.1.0)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ /usr/local/bin/bash ./test.sh
1 foo ./test.sh
6 bar ./test.sh
15 main ./test.sh

There seems to already be a bug report with the bash project.

like image 172
Jon Ericson Avatar answered Sep 21 '22 06:09

Jon Ericson