एक $ $ USER -c "<cmd>" के बाहर निकास कोड तक पहुँचना


8

नीचे दिए गए कमांड "0" या "1" को सही ढंग से विफलता के आधार पर प्रिंट करते हैं या नहीं क्योंकि मैं $ डालता हूं? "सु" कमांड के अंदर।

sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?"

हालांकि, अगर मैं ऐसा करता हूं:

sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null"; echo $?

यह हमेशा "0" प्रिंट करेगा क्योंकि वास्तविक "सु" हमेशा सफल होगा, भले ही कमांड भाग विफल हो।

कोई भी विचार कि मैं किस प्रकार से सबस्क्रिप्शन का निकास कोड पुनः प्राप्त कर सकता हूं?

जवाबों:


7

मैंने अभी लगभग वैसी ही स्थिति तय की है। आशा है कि यह अभी भी आपकी मदद करता है, यदि नहीं तो शायद अन्य। मैंने सु से शुरू किया, सूडो से नहीं, लेकिन जब से सूदो को एक अन्य कमांड को लपेटने का इरादा है, यह वास्तव में सु के निकास कोड को रिले करना चाहिए। यदि नहीं, तो आप सुडो स्तर पर भी नीचे दिए गए सुधार को लागू कर सकते हैं।

जैसे आपने नोट किया कि मुख्य समस्या यह है कि su सफलतापूर्वक अपने कमांड को निष्पादित करता है। डिफ़ॉल्ट क्रिया के बाद यह रिपोर्ट करना है कि यह बिना किसी समस्या के पूरा हुआ और इसलिए यह निकास कोड 0. लौटाता है। यह "नहीं जानता" कि एक कमांड से एक गैर 0 निकास कोड अप्रत्याशित था, या कि इसे इसके साथ कुछ करना चाहिए। इस प्रकार समाधान काफी सरल है, ताकि यह अंतिम कमांड का निकास कोड वापस कर सके। इसने मेरे लिए यह किया

su <user_x> -c '<bunch_of_commands>; exit $?'

मामले में sudo अच्छा नहीं खेलता है, पूरी कमांड कुछ इस तरह होनी चाहिए (मैं आपके लिए यह जाँच करूँगा लेकिन मेरे पास sudo स्थापित नहीं है)

sudo 'su <user_x> -c \'<bunch_of_commands>; exit $?\'; exit$?'

उद्धरण के घोंसले के लिए देखो और $ सुनिश्चित करें? विस्तार नहीं मिलता है, इसलिए कोई दोहरे उद्धरण नहीं।


2

कमांड के अंदर रिटर्न वैल्यू को इको करें और पूरे कमांड को एक वैरिएबल (एक सबशेल का उपयोग करके) को असाइन करके इसे बाहर एक्सेस करें।

RETVAL=$(sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?")
echo $RETVAL

0

आप हमेशा एक tmp फ़ाइल का उपयोग कर सकते हैं:

$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null; echo \$? > /tmp/exit_code"; cat /tmp/exit_code

हाँ, यह वही है जो मैं अभी कर रहा हूँ, लेकिन मैं एक tmp फ़ाइल पर भरोसा नहीं करने की उम्मीद कर रहा था।
निक

0

यह Zsh / Bash / Bourne गोले में काम करता है:

$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null"
$ echo $?

मुझे यकीन नहीं है कि जब आप वन-लाइनर में मांगते हैं तो रिटर्न कोड उपलब्ध नहीं होता है, लेकिन यह तब उपलब्ध होता है जब आप एक ही काम करने के लिए एक से अधिक लाइन का उपयोग करते हैं।


यह वास्तव में सही नहीं है। यह हमेशा शून्य पर लौटेगा क्योंकि "su -m $ USER -c <cmd>" हमेशा सफल होगा भले ही इसके भीतर वास्तविक कमांड न हो।
निक

1
@ निक - यह यहाँ काम करता है। आपका आउटपुट क्या है? sudo su -m zero2cx -c "/bin/false &> /dev/null"अपने सिस्टम उपयोगकर्ता नाम के साथ प्रयास करें । $?'1' होना चाहिए।
जीरो 2 एक्सएक्सएक्स

हाँ, अपने स्वयं के उपयोगकर्ता नाम के साथ यह "1" की उम्मीद के अनुसार देता है। लेकिन मैं अपने खुद के उपयोगकर्ता के माध्यम से एक ऐप को चलाने के लिए इसका उपयोग करने की कोशिश कर रहा हूं और रूट या किसी अन्य उपयोगकर्ता नहीं।
निक

@ निक - आपकी इच्छानुसार इसे $ USER=appusernameसेट के साथ काम करना चाहिए । उपयोगकर्ता को एक वास्तविक उपयोगकर्ता नाम न दें, अपने उद्देश्य से उपयोग करें appusername। यह काम करना चाहिए, यह मेरे लिए करता है।
शून्य २ सीएक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.