2014-11-26 2 views
1

Этот сценарий Bash ведет себя так, как ожидалось.Ловушка в экспортируемой функции молча игнорируется

test_this.sh

function run_this() { 
    trap "echo TRAPPED" EXIT 
    false 
    echo $? 
} 
run_this 

Он печатает

1 
TRAPPED 

Однако, когда я пытаюсь экспортировать эту функцию, она не ловушкой.

test_this2.sh

function run_this() { 
    trap "echo TRAPPED" EXIT 
    false 
    echo $? 
} 
export -f run_this 

Источник в командной строке и запустить его:

> source test_this2.sh 
> run_this 

Результаты в

1 

Где ловушка идти?

ответ

1

trap игнорируется, если вы export функцию, потому что, когда вы exit из вашей login оболочки (где функция экспортируется в), то больше не shell печатать trapped в. (Т.е. там никогда не бывает exit иначе больше не будет иметь оболочки.) Когда вы source test_this2.sh, вы выполните его в своем login shell. Когда функция завершится, она вернется к вашему login shell - выхода нет. Когда вы запустите test_this.sh, он будет выполнен в subshell, когда выйдет subshell, вы получите trapped. Если вы действительно хотите узнать, что произойдет, когда вы exit вашего login shell, попробуйте ввести exit и посмотреть, что произойдет.

1

Если вы хотите, чтобы функция «trap» оставила функцию, используйте сигнал RETURN. Используйте сигнал ERR для ошибок «ловушки», например, ваш «ложный» вызов.

test_this.ш

function run_this() { 
    trap "echo LEAVING" RETURN 
    trap "echo ERROR" ERR 
    false 
    echo $? 
} 
export -f run_this 

нагрузки и экспортируют функция

source this_this.sh 

тест он

run_this 

возвращает

ERROR 
1 
LEAVING 

начало подоболочка

bash 

тест снова

run_this 

возвращает

ERROR 
1 
LEAVING 

Так экспорт работает отлично.

PS: Я использую bash 4.3.42