trap na saída de comando não funciona a menos que seja usado em uma função ou sub-shell

3

Estou experimentando um pouco com trap no código de retorno de comando inválido usando um código de amostra

#!/bin/bash

# Exit on error
trap 'echo 'exiting..';exit' ERR
set -e

h=1
b=$((h+)) # <----- command causing the error
echo $?
echo $b
echo "end"

Não sou capaz de fazer com que a armadilha ocorra, mesmo que haja uma instrução ofensiva. Mas o mesmo se eu correr em uma sub-shell como

function junk() {
h=1
b=$((h+))
echo "Exit code:$?"
echo $b
echo "end"
echo "Hello"
}

junk

(ou) executando as instruções inteiras em um sub-shell como

(h=1
b=$((h+))
echo "Exit code:$?"
echo $b
echo "end"
echo "Hello"
)

sou capaz de capturar a falha do comando e o EXIT captura o trapping e imprime a mensagem de acordo.

Estou ciente do uso de set -e

-e  errexit When set, the shell exits when a simple command in a command list exits
    non-zero (FALSE). This is not done in situations, where the exit code is already checked 
    (if, while, until, ||, &&)

mas não consigo encontrar uma referência adequada onde diz que acontece apenas em um sub-shell ou uma função ou algo similar.

Deixe-me saber se estou perdendo algo básico aqui.

    
por Inian 29.12.2016 / 11:20

1 resposta

4

O que você está perdendo é que set -e e sigspec ERR se aplicam ao comando execução (comandos que saem com um valor diferente de zero). O que você tem aqui com b=$((h+)) é um erro parsing . O comando não é executado porque não é entendido.

Por que funciona em uma função ou sub-shell? Como esse erro de análise faz com que o script que contém (seja a função ou um sub-shell) falhe como um todo. Em outras palavras, isso não é b=$((h+)) que aciona sua armadilha (não há nenhuma armadilha em suas sub-cascas), esta é a falha da chamada para junk ou para a sua sub-casca.

    
por 29.12.2016 / 14:39