erros de interceptação em scripts bash

1

Eu tenho várias perguntas que quero entender em relação à armadilha de erros.

  1. por que o código abaixo executa apenas 1 trap e não 2 e especificamente apenas o código com "mydir2" e não "mydir1"?
  2. porque é que está a executar a armadilha?
  3. porque o comando, se escrito como o código marcado, não gerará uma armadilha.
  4. qual é a melhor maneira de escrever este código.
  5. por que e como obtenho o número de linha correto para o comando de erro e não a linha da função FuncA?

    #!/bin/bash
    
    set -o errtrace
    trap 'printerr' ERR
    function printerr(){
     local lc="$BASH_COMMAND" rc=$? ln=${BASH_LINENO[$i]}
     echo "$(date +%s) : Command [ $lc ] exited with code [ $rc ] in line [ $ln ]"
    }
    
    
    function FuncA(){
    
    [[ -d mydir1 ]] && echo mydir1OK
    
    [[ -d mydir2 ]] && echo mydir2OK
    
    #if [ -d /mtdir/ ] ;then
    #       echo OKMYDIR
    #fi
    
    }
    
    FuncA
    

Resultado:

1457453672 : Command [ [[ -d mydir2 ]] ] exited with code [ 1 ] in line [ 13 ]
    
por Asaf Magen 08.03.2016 / 17:34

1 resposta

1

Parece que a interceptação ERR é executada porque a função FuncA tem um status de saída diferente de zero. Conforme documentado em man bash

the exit status of a function is the exit status of the last command executed in the body.

Qual, nesse caso, foi o [[ -d mydir2 ]] . Você pode adicionar um true como o último comando na função para impedi-lo.

A construção if é diferente porque (mesmo manual):

The exit status is the exit status of the last command executed, or zero if no condition tested true.

Eu recomendaria usar if em vez de adicionar true .

    
por 08.03.2016 / 17:49