RETURN trap no Bash não executando para função

4

Estou entrando em armadilhas no Bash novamente. Acabei de notar que a armadilha RETURN não dispara para funções.

$ trap 'echo ok' RETURN
$ f () { echo ko; }
$ f
ko
$ . x
ok
$ cat x
$ 

Como você pode ver, o resultado é esperado para o fornecimento do arquivo vazio x .

O man do Bash o tem:

If a sigspec is RETURN, the command arg is executed each time a shell function or a script executed with the . or source builtins finishes executing.

O que estou perdendo então?

Eu tenho o GNU bash, versão 4.4.12 (1) -release (x86_64-pc-linux-gnu).

    
por Tomasz 23.01.2018 / 08:31

2 respostas

3

Pelo que entendi, há uma exceção ao snippet de documento na minha pergunta. O trecho foi:

If a sigspec is RETURN, the command arg is executed each time a shell function or a script executed with the . or source builtins finishes executing.

A exceção é descrita aqui:

All other aspects of the shell execution environment are identical between a function and its caller with these exceptions: the DEBUG and RETURN traps (see the description of the trap builtin under SHELL BUILTIN COMMANDS below) are not inherited unless the function has been given the trace attribute (see the description of the declare builtin below) or the -o functrace shell option has been enabled with the set builtin (in which case all functions inherit the DEBUG and RETURN traps), and the ERR trap is not inherited unless the -o errtrace shell option has been enabled.

Quanto a functrace , pode ser ativado com typeset ' -t :

-t Give each name the trace attribute. Traced functions inherit the DEBUG and RETURN traps from the calling shell. The trace attribute has no special meaning for variables.

Também set -o functrace faz o truque.

Aqui está uma ilustração.

$ trap 'echo ko' RETURN
$ f () { echo ok; }
$ cat y
f
$ . y
ok
ko
$ set -o functrace
$ . y
ok
ko
ko

Quanto a declare , é novamente a opção -t :

-t Give each name the trace attribute. Traced functions inherit the DEBUG and RETURN traps from the calling shell. The trace attribute has no special meaning for variables.

Além disso, extdebug ativa o rastreamento de funções, como na resposta do ikkachu .

    
por 23.01.2018 / 10:54
1

No Bash 4.4, parece funcionar apenas para funções se extdebug estiver habilitado, embora eu não possa ver o mencionado na documentação.

$ cat ret.sh 
trap "echo ret" RETURN
foo() { echo "$1"; }
foo "without extdebug"
shopt -s extdebug
foo "with extdebug"

$ bash ret.sh
without extdebug
with extdebug
ret

$ bash --version |head -1
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)

No Bash 4.3, parece que não funciona para funções.

    
por 23.01.2018 / 10:17