bash set -e का कोई प्रभाव नहीं है


1

मैं चाहता हूं कि यदि लाइब्रेरी फंक्शन फेल हो जाए, तो मैं बैश एप्लिकेशन को लाइब्रेरी को मार देना चाहता हूं।

मुझे बताया गया set -eहै कि यह करता है।

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"

चलाओ

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

die1 के साथ बाहर तो app.shसाथ set -eमारा जाना चाहिए, है ना?

यह काम क्यों नहीं किया?


आपकी स्क्रिप्ट होगा बाहर निकलने अगर तुमने किया था info=$(get_info); echo "won't see this $info"। बफ़लिंग
ग्लेन जैकमैन

जवाबों:


2

मुझे लगता है कि जिस तरह से आप इसका उपयोग कर रहे हैं वह भ्रमित करने वाला हिस्सा है। समस्या यह है कि आप सिर्फ कॉल नहीं कर रहे हैं get_info, आप उस परिणाम का उपयोग दूसरे आदेश ( echoयहाँ) के हिस्से के रूप में कर रहे हैं । वह अन्य आदेश सफल होता है, और इसलिए त्रुटि स्थिति कभी भी बैश से बाहर निकलने को ट्रिगर नहीं करती है। यदि आप अपनी स्क्रिप्ट को थोड़ा बढ़ाते हैं तो आप इसे देख सकते हैं:

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

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

info2प्रिंट करने के लिए कभी नहीं मिलेगा , क्योंकि यह चर असाइनमेंट के दौरान बाहर निकलता है।

set -eवास्तव में मुश्किल है, अक्सर अनुशंसित नहीं है। आप इसके बारे में अधिक पढ़ सकते हैं यहाँ और यहाँ


संक्षेप में, मेरे dieकार्य को लागू करने का सही तरीका क्या है ? मैंने कोशिश की, trapलेकिन लगता है कि इस स्थिति में भी caveats है।
spraff

@spraff आपको वास्तव में रास्ते में मूल्यों की जांच करनी होगी, या जैसा मैंने दिखाया विभिन्न चरणों में करते हैं। जब आप dieएक उपधारा में चल रहे होते हैं, तो यह गारंटी नहीं दे सकता कि यह माता-पिता से बाहर निकल जाएगा - ठीक है, जब तक कि यह killमाता-पिता का अनुमान नहीं है, लेकिन मुझे यकीन नहीं है कि आप सही काम करेंगे अगर आप कई गोले नीचे हैं
एरिक रेनॉफ़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.