हर कमांड के लिए एक्ज़िट स्टेटस प्रिंट करने के लिए बैश को कैसे कॉन्फ़िगर करें?


12

हर कमांड बैश रिटर्न में एक एक्जिट कोड के साथ चलता है।

जब भी मैं बैश प्रॉम्प्ट पर एक कमांड टाइप करता हूं, मैं चाहता हूं कि यह एक्जिट स्टेटस दिखाए, यानी echo $?

उदाहरण के लिए, अगर मैं echo "hello";बैश प्रॉम्प्ट पर चलता हूं, तो आउटपुट होना चाहिए:

linux@linux$ hello
linux@linux$ 0

अपने सवाल को unix.stackexchange.com पर पोस्ट करने के बारे में क्या ?

धन्यवाद @ फ्रेंक। लेकिन क्या यह सवाल रखना भी एक अच्छी जगह है?
राविदीक्षित

मैंने पीएस 1 चर का एक हिस्सा प्रिंट करने की कोशिश की, लेकिन उन कारणों से काम नहीं करता जिन्हें मैं अभी तक नहीं समझता हूं।
रावदिक्षीत

जवाबों:


13

अंतिम निष्पादित कमांड से निकास कोड को $?पर्यावरण चर में संग्रहीत किया जाता है । तो आप बस इस वैरिएबल को डिफॉल्ट कमांड प्रॉम्प्ट में जोड़ सकते हैं और आपके पास हमेशा वहां से बाहर निकलने वाला कोड होगा। प्रॉम्प्ट को $PS1पर्यावरण चर में संग्रहीत किया जाता है । इसे शुरू में /etc/bash.bashrcस्क्रिप्ट में और बाद में सेट किया गया है $HOME/.bashrc

तो डिफ़ॉल्ट मान से लाइन को $HOME/.bashrc( /etc/bash.bashrcसिस्टम वाइड होगा) संपादित करें :

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

इस के लिए (उदाहरण के लिए):

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w[$?] \$ '

इसलिए डिफ़ॉल्ट में परिवर्तित करने के लिए:

user@host:/path/to/dir[0] $

कोष्ठक में 0 आपका निकास कोड है, देखें:

user@host:~[0] $ ls
user@host:~[0] $ ls /root/
ls: cannot open directory /root/: Permission denied
user@host:~[2] $ ^C
user@host:~[130] $

अर्थ के लिए http://www.tldp.org/LDP/abs/html/exitcodes.html देखें


मैंने इसे करने की कोशिश की, लेकिन हाथ में काटने के लिए, इसके काम नहीं कर रहा था। यह हमेशा दिखाता है कि मैं किस मशीन पर काम कर रहा हूं।
राविडिक्सिट

क्या आप वाकई बैश चलाते हैं? आप readlink /proc/$$/exeकृपया के उत्पादन की नकल कर सकते हैं ? 0 का मतलब कोई त्रुटि नहीं है, क्या आपने कुछ ऐसा प्रयास किया है जो त्रुटि देता है: ^Cया falseया asdasdasd?
अराजक

1
@chaos के रूप में मेरा PS1 है PS1=$(printf "%s\\\\u@\h:%s%s\w[$?]$%s " "$yellow" "$end" "$blue" "$end"), लेकिन यह 0हर समय दिखाता है । कोई विचार क्यों?
अधिकतम

1
यह अच्छा होगा, अगर बाहर निकलने की स्थिति केवल दिखाई जाएगी, अगर यह असमान है 0
rubo77

1
@ मोम ऐसा इसलिए है क्योंकि आपकी सेटिंग करते समय आपका $?विस्तार पहले से ही है । करो और तुम देखोगे। आपको या तो सिंगल कोट्स का उपयोग करना होगा, या इसे जैसे बचना होगा । 0PS1echo $PS1\$?
वारबकी 19

7

एक और तरीका जो मैंने आर्क विकी से लिया था वह था trap:

EC() { echo -e '\e[1;33m'code $?'\e[m\n'; }
trap EC ERR

प्रभाव:

$ ( exit 1 )
code 1

$ some-non-existent-command
some-non-existent-command: command not found
code 127

$

2
यह ओपी की आवश्यकताओं को पूरा नहीं करता है, क्योंकि वह शून्य होने पर भी बाहर निकलने की स्थिति प्रिंट करना चाहता है - लेकिन यह वही है जो मैं देख रहा हूं।
कीथ थॉम्पसन

2

ये रहा एक सरल उदाहरण:

PS1='$? > '

यदि दोहरे उद्धरण चिह्नों का उपयोग कर रहे हैं, तो आपको बचने के लिए एक बैकस्लैश जोड़ना होगा $:

PS1="\$? > "

आउटपुट:

0 > echo 'ok'
ok
0 > bogus
bogus: command not found
127 > 

एक बेहतर तरीका केवल गैर-शून्य होने पर निकास कोड प्रिंट करना है।

PS1='${?#0}> '    # single quote example
PS1="\${?#0}> "   # double quote example (requires extra backslash)

नमूना उत्पादन:

> echo 'ok'
ok
> bogus
bogus: command not found
127> 

स्पष्टीकरण: ${var#pattern}एक बैश पैरामीटर विस्तार है जिसका अर्थ है कि $ var के सामने से सबसे छोटा मिलान पैटर्न हटा दें। तो इस मामले में, हम 0सामने से हटा रहे हैं $?, जो प्रभावी रूप से बाहर निकलने के कोड को काट देगा 0

यदि हर बार मूल्यांकन किए जाने के बजाय , दोहरे उद्धरण चिह्नों का उपयोग $?किया PS1जाता है, तो इसे सेट किया जाएगा। क्या echo $PS1इस बात की पुष्टि करने के लिए आप में एक hardcoded मूल्य की जरूरत नहीं है PS1


जनवरी 2018 से धन्यवाद। मैं गैर-शून्य होने पर शुरुआत में बाहर निकलने के कोड के साथ सामान्य संकेत चाहता हूं - इससे बहुत मदद मिलती है।
एसडीसोलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.