आज्ञाओं पर विचार करें
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 okstring=false
eval falseस्क्रिप्ट को समाप्त करने की उम्मीद करेंगे भले ही यह AND-OR सूची या सशर्त विवरण का हिस्सा हो? मैं नहीं होगा
set -eसेट किया गया है तो यह सही व्यवहार है ... मैं सहमत हूं कि यह एक सशर्त बयान में समाप्त नहीं होने के लिए समझ में आता है।
set -eइसलिए `()` का उत्तर है।
eval falseएक गैर-शून्य स्थिति उत्पन्न करता है इसलिए मैंset -eउस बिंदु पर स्क्रिप्ट को समाप्त करने की उम्मीद करूंगा । के!set -eरूप में लागू नहीं होता है के मामले में!स्पष्ट रूप से बाहर निकलने की स्थिति की जाँच करता है।