आज्ञाओं पर विचार करें
eval false || echo ok
echo also ok
आमतौर पर, हम इसकी false
उपयोगिता को अंजाम देना चाहते हैं और, जब से निकास स्थिति गैर-शून्य है, तब निष्पादित echo ok
और echo also ok
।
सभी में POSIX की तरह गोले मैं का उपयोग करें ( ksh93
, zsh
, bash
, dash
, OpenBSD ksh
, और yash
), तो ऐसा होता है, लेकिन बातें दिलचस्प अगर हम सक्षम मिलता set -e
।
यदि set -e
प्रभाव में है, OpenBSD के sh
और ksh
गोले (दोनों व्युत्पन्न pdksh
) स्क्रिप्ट निष्पादित करते समय समाप्त कर देंगे eval
। कोई अन्य शेल ऐसा नहीं करता है।
पोसिक्स का कहना है कि विशेष अंतर्निहित उपयोगिता (जैसे eval
) में एक त्रुटि गैर-इंटरैक्टिव शेल को समाप्त करने का कारण बननी चाहिए। मुझे पूरी तरह से यकीन नहीं है कि निष्पादन false
"एक त्रुटि" का गठन करता है (यदि यह था, तो यह set -e
सक्रिय होने से स्वतंत्र होगा )।
इसके चारों ओर काम करने का तरीका eval
एक उप खोल में रखा गया है,
( eval false ) || echo ok
echo also ok
सवाल यह है कि क्या मुझे POSIX-ly सही शेल स्क्रिप्ट में ऐसा करने की उम्मीद है, या क्या यह OpenBSD के शेल में बग है? इसके अलावा, POSIX पाठ में "त्रुटि" से क्या तात्पर्य है?
अतिरिक्त जानकारी: OpenBSD के गोले कमांड के echo ok
साथ और बिना दोनों को निष्पादित करेंगेset -e
eval ! true || echo ok
मेरा मूल कोड जैसा दिखता था
set -e
if eval "$string"; then
echo ok
else
echo not ok
fi
जो OpenBSD के गोले (इसे समाप्त करेगा) का उपयोग करने के साथ आउटपुट नहीं करेगा, और मुझे यकीन नहीं था कि यह डिजाइन द्वारा, गलती से या गलतफहमी से, या कुछ और था।not ok
string=false
eval false
स्क्रिप्ट को समाप्त करने की उम्मीद करेंगे भले ही यह AND-OR सूची या सशर्त विवरण का हिस्सा हो? मैं नहीं होगा
set -e
सेट किया गया है तो यह सही व्यवहार है ... मैं सहमत हूं कि यह एक सशर्त बयान में समाप्त नहीं होने के लिए समझ में आता है।
set -e
इसलिए `()` का उत्तर है।
eval false
एक गैर-शून्य स्थिति उत्पन्न करता है इसलिए मैंset -e
उस बिंदु पर स्क्रिप्ट को समाप्त करने की उम्मीद करूंगा । के!
set -e
रूप में लागू नहीं होता है के मामले में!
स्पष्ट रूप से बाहर निकलने की स्थिति की जाँच करता है।