bash set -e etkisiz


1

Bir kütüphane işlevi başarısız olursa kütüphaneyi oluşturan bash uygulamasının öldürülmesini istiyorum.

bana söylendi set -e bunu yapar.

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"

Koş

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

die 1 ile çıktım app.sh ile set -e de öldürülmeli, değil mi?

Bu neden işe yaramadı?


Senaryonun olur eğer çıksan çık info=$(get_info); echo "won't see this $info". şaşırtıcı
glenn jackman

Yanıtlar:


2

Bence onu kullanma şekliniz kafa karıştırıcı. Sorun şu ki, sadece aramıyorsun. get_info, bunun sonucunu başka bir komutun parçası olarak kullanıyorsunuz ( echo İşte). Bu diğer komut başarılı olur ve bu nedenle hata koşulu asla çıkışı bash'den tetiklemez. Senaryonuzu biraz uzatırsanız bunu görebilirsiniz:

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

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

asla ulaşamayacak info2 Değişken atama sırasında çıkar çünkü yazdırın.

set -e gerçekten zor, genellikle tavsiye edilmez. Bu konuda daha fazla okuyabilirsiniz İşte ve İşte


Özetle, benim doğru uygulamanın ne yolu die işlev o zaman? denedim trap ama bu durumda da uyarılar var gibi görünüyor.
spraff

@ spraff aslında değerleri yol boyunca kontrol etmeniz veya gösterdiğim gibi farklı adımlarda yapmanız gerekir. Kaçarken die Bir alt kabukta, ana çıkıştan çıkacağını garanti edemez. kill ebeveyni sanırım, ama birkaç mermi varken doğru çalışacağından emin değilim.
Eric Renouf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.