2015-08-19 2 views
4

Внутри bash, как может обработчик RETURN получить текущий код возврата?код возврата возврата функции из ловушки RETURN-обработчик

Например

#!/usr/bin/env bash 

function A() { 
    function A_ret() { 
     # How to access the return code here? 
     echo "${FUNCNAME} ???" 
    } 
    trap A_ret RETURN 
    echo -n "${FUNCNAME} returning code $1 ... " 
    return $1 
} 
A 1 

Печатается

A returning code 1 ... A_ret ??? 

Я хотел бы, чтобы напечатать

A returning code 1 ... A_ret 1 

Как можно A_ret доступа A код возврата?


Подобно this stackoverflow question Get the exitcode of the shell script in a “trap EXIT”.

+0

Оценить '' $ после того, как вы называете функции в вашем скрипте?. –

+0

@ DavidC.Rankin. За титул функция ловушки 'RETURN',' A_ret', должна получить код возврата 'A'. – JamesThomasMoon1979

+0

Да, я наткнулся на это. Тройн выпрямил меня. Как показано ниже, возврат из 'trap' всегда будет' 0', если не будет ошибки спецификации сигнала. Хороший вопрос. –

ответ

2

Похоже, что ловушка RETURN выполняется до того, как инструкция return фактически устанавливает новое значение $?. Рассмотрим этот пример, который устанавливает $? непосредственно перед оператором return.

a() { 
    a_ret() { 
     echo "${FUNCNAME} $?" 
    } 
    trap a_ret RETURN 
    printf "${FUNCNAME} returning code $1 ... " 
    (exit 54) 
    return $1 
} 

a 1 

bash В 3.2 и 4.3, я получаю в качестве выходного

a returning code 1 ... a_ret 54 

Я бы сказал, что это ошибка, чтобы сообщить. В качестве обходного пути, вы всегда можете использовать подоболочку exit значением, которое вы собираетесь вернуться:

a() { 
    ... 
    (exit $1) 
    return $1 
} 
Смежные вопросы