Таинственный LINENO в ловушке bash ERR

Я просто играл с bash, чтобы обойти эту летнюю дневную жару, как вдруг я получил таинственный результат, для которого я не могу определить его происхождение.

Позвольте мне объяснить это немного. бит.

Я играю с trap ERR, чтобы создать некоторые функции отладки для моих сценариев bash.

Это сценарий, который работает нормально:

traperror () {
    local err=$? # error status
    local line=$1 # LINENO
    [ "$2" != "" ] && local funcstack=$2 # funcname
    [ "$3" != "" ] && local linecallfunc=$3 # line where func was called
    echo "<---"
    echo "ERROR: line $line - command exited with status: $err" 
    if [ "$funcstack" != "" ]; then
        echo -n "   ... Error at function ${funcstack[0]}() "
        if [ "$linecallfunc" != "" ]; then
            echo -n "called at line $3"
        fi
        echo
    fi
    echo "--->" 
    }
#trap 'traperror $LINENO ${FUNCNAME}' ERR

somefunction () {
trap 'traperror $LINENO ${FUNCNAME} $BASH_LINENO' ERR
asdfas
}

somefunction

echo foo

Результатом является (stderr переходит в / dev / null для ясности; ошибка bash, конечно же, foo.sh: строка 23: asdfas: команда не найдена , что, как вы знаете, код ошибки 127)

~$ bash foo.sh 2> /dev/null 
<---
ERROR: line 21 - command exited with status: 127
   ... Error at function somefunction() called at line 24
--->
foo

Все номера строк справа , строка 21 - это место, где запускается функция somefunction, а строка 24 - место, где она вызывается.

Однако , если я раскомментирую первую ловушку (главную), я получить этот вывод:

~$ bash foo.sh 2> /dev/null 
<---
ERROR: line 21 - command exited with status: 127
   ... Error at function somefunction() called at line 24
--->
<---
ERROR: line 15 - command exited with status: 127
--->
foo

Если я раскомментирую первую ловушку и закомментирую вторую, я получаю, что ошибка находится в строке 23, что тоже правильно, потому что это абсолютная строка, в которой размещена неправильная команда.

~$ bash foo.sh 
<---
ERROR: line 23 - command exited with status: 127
--->
foo

Итак, мой вопрос: почему строка 15? откуда этот номер строки? Строка 15 - последняя строка в функции ловушки. Может ли кто-нибудь объяснить простым языком, почему trap возвращает последнюю строку вызываемой функции как строку, которая вызвала ошибку в строке 21 ?

Заранее спасибо!

EDIT

Только что если кого-то интересует функция отладки. Это рабочая версия:

# Copyright (c): Hilario J. Montoliu <hmontoliu@gmail.com>
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.  See http://www.gnu.org/copyleft/gpl.html for
# the full text of the license.

set -o errtrace
trap 'traperror $? $LINENO $BASH_LINENO "$BASH_COMMAND" $(printf "::%s" ${FUNCNAME[@]})'  ERR

traperror () {
    local err=$1 # error status
    local line=$2 # LINENO
    local linecallfunc=$3 
    local command="$4"
    local funcstack="$5"
    echo "<---"
    echo "ERROR: line $line - command '$command' exited with status: $err" 
    if [ "$funcstack" != "::" ]; then
        echo -n "   ... Error at ${funcstack} "
        if [ "$linecallfunc" != "" ]; then
            echo -n "called at line $linecallfunc"
        fi
        else
            echo -n "   ... internal debug info from function ${FUNCNAME} (line $linecallfunc)"
    fi
    echo
    echo "--->" 
    }

somefunction () {
    asdfasdf param1
    }

somefunction

echo foo

Что будет работать как:

~$ bash foo.sh 2> /dev/null 
<---
ERROR: line 26 - command 'asdfasdf param1' exited with status: 127
   ... Error at ::somefunction::main called at line 29
--->
<---
ERROR: line 22 - command 'asdfasdf param1' exited with status: 127
   ... internal debug info from function traperror (line 0)
--->
foo
11
задан hmontoliu 1 July 2014 в 06:29
поделиться