bash set -e não tem efeito

1

Eu quero o aplicativo bash que origina que a biblioteca seja eliminada se uma função da biblioteca falhar.

Me disseram que set -e faz isso.

lib.sh

#!/bin/bash

function die
{
    echo "dying: $1"
    exit 1
}

function get_info
{
    die "oops an error"
}

app.sh

#!/bin/bash

set -e

source "lib.sh"

echo "info: $(get_info)"

echo "ok"

Execute

$> bash app.sh
info: dying: oops an error
ok

die saiu com 1, então app.sh com set -e também deve ser eliminado, certo?

Por que isso não funcionou?

    
por spraff 13.09.2016 / 13:21

1 resposta

2

Eu acho que o jeito que você está usando é a parte confusa. O problema é que você não está apenas chamando get_info , você está usando o resultado disso como parte de outro comando ( echo here). Esse outro comando é bem-sucedido e, portanto, a condição de erro nunca aciona a saída do bash. Você pode ver isso se você estender seu script um pouco:

echo "info: $(get_info)"
echo "ok"

v=$(get_info)
printf 'info2: %s\n' "$v"
printf 'ok2\n'

nunca chegará à info2 print, porque sai durante a atribuição da variável.

set -e é realmente complicado, geralmente não é recomendado. Você pode ler mais sobre isso aqui e aqui

    
por 13.09.2016 / 13:35

Tags