कार्यक्रम के निष्पादन के बाद प्रिंट मूल्य


9

मैं सोच रहा हूं कि टाइपिंग के बिना टर्मिनल में हर प्रोग्राम के निष्पादन के बाद ऑटो प्रिंट रिटर्न वैल्यू का विकल्प कैसे सेट किया जाए echo $?

क्या यह कुछ ऐसा है जो सेटअप किया जा सकता है? कोडब्लॉक में वह सुविधा है।

जवाबों:


10

हां, दो तरीके हैं। एक में सेट करना PROMPT_COMMANDहै .bashrc, दूसरा - कमांड के PS1लिए कमांड प्रतिस्थापन स्थापित करना है echo $?

विधि 1:

बैश मैनुअल पेज से:

PROMPT_COMMAND

      If set, the value is executed as a command prior to issuing each
      primary prompt.

जो भी आप इस चर को सेट करते हैं, उसे हर बार प्रॉम्प्ट खींचने से पहले चलाया जाएगा। डेमो:

$> PROMPT_COMMAND=" echo 'Last command exited with'  \$? 'code'  "
Last command exited with 0 code
$> ls /etc/passwd > /dev/null
Last command exited with 0 code
$> ls /etc/asdf > /dev/null
ls: cannot access /etc/asdf: No such file or directory
Last command exited with 2 code
$> 

के उपयोग पर ध्यान दें \$?। स्थायी परिवर्तन के लिए, इसे सहेजें.bashrc

विधि 2

मान लीजिए कि मेरा PS1संकेत इस तरह सेट है:

PS1='
user@ubuntu:$> '

अगर मैं हर बार कुछ प्रॉम्प्ट चलाना चाहता हूं, तो यह प्रॉम्प्ट स्क्रीन पर रिडर्न किया जाता है (जो कि प्रत्येक पूर्ववर्ती कमांड रन के बाद है), मुझे command substitution $(. . .) इसे प्रॉम्प्ट में उपयोग करने और सेट करने की आवश्यकता होगी :

PS1=' [ $? ] 
user@ubuntu: $> '

डेमो:

$> PS1=' [ $? ]
> $>_ '
 [ 0 ]
$>_ ls /etc/passwd > /dev/null
 [ 0 ]
$>_ ls /etc/asdf > /dev/null                                                                                                      
ls: cannot access /etc/asdf: No such file or directory
 [ 2 ]
$>_ 

ध्यान दें कि मैंने अपने PS1 को दो लाइनों में विभाजित किया है, ऊपर [ exitcode ]और नीचे होगा $> <blank space>'। क्यों नहीं है यही कारण है >इससे पहले कि $> 'दूसरी पंक्ति पर (अग्रणी >है PS2बहु आदेश के लिए शीघ्र)। वैकल्पिक रूप से, आप ऐसा कुछ कर सकते हैं ( $'...'संरचना पर ध्यान दें ):

  $> PS1=$'[ $? ] \n$> '                                                                                                  
[ 0 ] 
$> 

+1 जो वास्तव में काम करता है। मैं 27k प्रतिष्ठा के साथ किसी पर शक नहीं कर रहा हूं, लेकिन जाहिर है कि प्रॉम्प्ट "कमांड" नहीं है, इसलिए $ का उपयोग कर रहा हूं? इसमें $ नहीं मिलता है शून्य पर रीसेट जैसा मैंने सोचा कि यह हो सकता है - यहां तक ​​कि पहली विधि का उपयोग करना जो बिना किसी त्रुटि के गूंज निष्पादित करता है।
जो

PS1उपयोगकर्ता इनपुट प्राप्त करने से पहले मुद्रित होने वाला सिर्फ पाठ है - इससे अधिक कुछ नहीं। यह पैरामीटर विस्तार और कमांड प्रतिस्थापन के लिए प्रतिरक्षा नहीं है, इसलिए आप $(...)उदाहरण के लिए, इसमें कुछ भी डाल सकते हैं $( pwd )और यह वहां दिखाई देगा। मैंने लैपटॉप की बैटरी पावर दिखाने के लिए एक कस्टम स्क्रिप्ट के साथ उपयोग किया है, उदाहरण के लिए
सर्जियो कोलोडियाज़नी

@ मचिद का क्या मतलब है?
सेर्गेई कोलोडियाज़नी

1
@mchid "प्रत्येक प्राथमिक संकेत जारी करने से पहले", इसलिए अंतिम आदेश पूरा करने के बाद।
कोस

1
@ mchid यह प्रॉम्प्ट प्रिंट होने से पहले चलाया जाता है - इसलिए इससे पहले कि आप अगली कमांड टाइप करें।
मुरु

4

एक विधि जो मैंने आर्क विकी से ली थी वह है trap ERRtrapएक संकेत प्राप्त होने पर, या कुछ अन्य घटनाओं के लिए कमांड चलाने के लिए बैश में उपयोग किया जाता है। ERRजब भी वर्तमान कमांड लाइन एक त्रुटि के साथ समाप्त होती है, तो एक जाल चलाया जाता है - वापसी मान 0. नहीं है (यदि यह सामान्य रूप से समाप्त हो गया, तो वापसी मूल्य स्पष्ट रूप से 0. होगा)

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

trap 'printf "\ncode %d\n\n" $?' ERR

फिर:

$ echo foo
foo
$ false

code 1

$

(नोट: echoआदेश के बाद कोई संदेश जो सफलतापूर्वक चला - इसका क्या मतलब है जब मैं एक कमांड टाइप करता हूं और टर्मिनल कुछ भी नहीं करता है? )

आर्क विकी टिप ने आगे बढ़कर संदेश को रंगीन किया, ताकि आपको एक ध्यान देने योग्य पीला संदेश मिले:

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

प्रभाव:

यहां छवि विवरण दर्ज करें

वास्तव में, मुझे जो कुछ भी करने की ज़रूरत है codeवह आउटपुट में एक पीले रंग के लिए नजर रखना है ताकि एक कमांड विफल हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.