मेरे टर्मिनल में कोई भी आदेश जो गैर-शून्य कोड के साथ बाहर निकलता है, मेरे टर्मिनल विंडो को बंद कर देता है


22

पहले तो यह थोड़ा मज़ेदार था, जैसे "बैश रूले" खेलना ... लेकिन अब यह पुरानी लोल हो रही है

मेरे टर्मिनल में कोई भी आदेश जो गैर-शून्य कोड के साथ बाहर निकलता है, मेरे टर्मिनल विंडो को बंद कर देता है

मुझे बताया गया था कि शायद मैंने set -eकुछ बैश स्क्रिप्ट में सेट किया है जो कि मेरे टर्मिनल स्रोत हैं।

मैंने जाँच की है .bash_profile/ .bashrc/ .profileऔर ऐसा नहीं लगता set -eहै कि वहाँ है।

क्या कोई अन्य स्पष्ट अपराधी होंगे?


7
निष्पादित करें set +e, क्या यह समस्या को ठीक करता है? यदि ऐसा है, जिसे मैं मानता हूं, तो आपको उसकी तलाश करते रहना होगा set -e। यह इन फ़ाइलों के वैश्विक संस्करणों में /etc, या उनसे प्राप्त किसी अन्य स्क्रिप्ट में हो सकता है। अपनी कॉन्फ़िगरेशन फ़ाइलों को दूर ले जाएं, यदि समस्या ठीक हो गई है, तो यह देखने के लिए कि वह कहां टूटती है, छोटी पंक्तियों में लाइनों को वापस जोड़ें।
इग्मोंट

3
PS4=' ${BASH_SOURCE}:$LINENO: ' bash -lixc true |& grep -e set -e trapजानकारीपूर्ण हो सकता है।
मूरू

आप विशेष चर के साथ वर्तमान में सक्षम शेल फ्लैग के सेट का निरीक्षण कर सकते हैं -जैसे echo $-:।
डेविड फ़ॉर्स्टर

जवाबों:


21

ठीक है, तो वास्तव में, यह एक रास्ता था set -eजिसने मेरी परेशानी का कारण बना।

जिस तरह से मैंने पाया set -eवह उपयोग कर रहा थाbash -lx

उपयोग करने के लिए सबसे अच्छी बात यह होगी:

bash -lx > lx.log 2>&1

फिर उस लॉग फ़ाइल को खोलें और एक खोज करें set...

एक बार जब आपको वह रास्ता मिल जाता है set -eतो आप उस लाइन को हटा सकते हैं और आपकी समस्या दूर हो जानी चाहिए! (मशीन पुनरारंभ एक अच्छा विचार हो सकता है)।

मेरे मामले में, set -eएक फ़ाइल जो .bash_profile स्रोतों में थी, लेकिन लाइन .bash_profile में ही नहीं थी।


3
sourceआपके शेल में सुरक्षित चीजें केवल "यादृच्छिक शेल स्क्रिप्ट" की तुलना में बहुत छोटा सेट है। -eगूंगा त्रुटि जाँच के लिए वास्तविक लिपियों में उपयोगी हो सकता है। (या यह सुनिश्चित करने के लिए कि आप कुछ भी त्रुटि की जांच करना नहीं भूलते हैं ।)
पीटर कॉर्ड्स

जाहिरा तौर पर यह मामला है ... काश ऐसा कुछ होता global set -eजिससे set -eकेवल लिपि प्रभावित होती
अलेक्जेंडर मिल्स

@AlexanderMills, ऐसा करने के लिए, आप $-आंतरिक स्क्रिप्ट में ध्वज की जांच कर सकते हैं और अंत में इसकी स्थिति को पुनर्स्थापित कर सकते हैं, या बस इसे मुख्य स्क्रिप्ट पर रीसेट कर सकते हैं यदि आपको पता है कि आपके पास ऐसी स्क्रिप्ट हैं जो इसे सेट करेगी
ilkkubu

तो मुझे लगता है कि local set -eकेवल एक बश फ़ंक्शन में इस्तेमाल किया जा सकता है?
अलेक्जेंडर मिल्स

13

तुम सिर्फ समस्या का समाधान चाहते हैं, में शामिल set +eअपने में .bashrc- कम से अंत।

आप खुदाई करने जा सकते हैं - बहुत सी अन्य जगहें हैं जहाँ set -eहो सकता है - लेकिन यह बहुत ध्यान रखेगा।

यदि, हालांकि, set -eआपका हिस्सा है $PROMPT_COMMANDतो ऊपर काम नहीं करेगा। कोशिश करें printf '%s\n' "$PROMPT_COMMAND"और देखें कि इसमें क्या है।


मेरी मशीन पर, जब मैं एक टर्मिनल खोलता हूं, तो printf '%s\n' "$PROMPT_COMMAND"बस व्हाट्सएप की पैदावार होती है, वहां कुछ भी नहीं
अलेक्जेंडर मिल्स

@AlexanderMills, तो वह आपकी समस्या नहीं है। $PROMPT_COMMANDटर्मिनल टैब नाम या विंडो नाम को अद्यतन करने के लिए एक सामान्य उपयोग है; MacOS X और Ubuntu दोनों ही ऐसा करते हैं। मैक के लिए इस पर डेटा के लिए Apple.stackexchange.com/q/220641/151730 देखें ।
वाइल्डकार्ड

मैं इस समस्या का जवाब मिल गया है और अपने खुद के जवाब कहा, set +eनहीं काम किया है, शायद इसलिए क्योंकि यह था इससे पहले किset -e मेरी sourced बैश फ़ाइलों में कॉल।
अलेक्जेंडर मिल्स

1
@AlexanderMills, हाँ, मुझे लगा कि निहित था। मेरा मतलब आपके साथ जुड़ना था , इसे शुरू में नहीं रखना। मैंने अपने उत्तर में स्पष्ट कर दिया है। अच्छा है कि आपको स्रोत मिल गया! set +e.bashrc
वाइल्डकार्ड

हाँ, set +eयह स्पष्ट रूप से सिर्फ एक बैंड-सहायता है, लेकिन आपने कहा कि
अलेक्जेंडर मिल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.