अगर मैंने काम किया है या नहीं किया है तो क्या मैं सभी कमांडों को फीडबैक दे सकता हूं?


11

कभी-कभी जब मैं कमांड चलाता हूं तो यह आउटपुट प्रदर्शित नहीं करता है, इसलिए मुझे यकीन नहीं है कि उन्होंने काम किया है या नहीं। क्या सभी कमांड्स के पास फीडबैक देना संभव है कि क्या वे सही तरीके से भागे हैं या नहीं? या फीडबैक आईडी प्रदर्शित करने के लिए नंगे न्यूनतम पर वे भाग गए हैं (ठीक है या नहीं)


6
सामान्य विचार है: कोई प्रतिक्रिया का मतलब यह काम नहीं किया है।
रिनजविंड

1
यह बिल्कुल सच नहीं है। उदाहरण के लिए, cryptsetupडिफ़ॉल्ट रूप से कुछ त्रुटि संदेश छोड़ सकते हैं। $?अपने में होना अच्छी बात है PS1। अगला चरण वर्तमान समय को जोड़ने के साथ-साथ हमेशा कमांड की टाइमिंग जानना है;)
d33tah

जवाबों:


11

(मुझे लगता है कि जब से आप उबंटू के अंदर पोस्ट कर रहे हैं, तो हम मान सकते हैं कि आप डिफ़ॉल्ट शेल के बारे में बात कर रहे हैं, यानी बैश ।)

स्टैक ओवरफ्लो प्रश्न में एक बहुत अच्छा जवाब है एक शेल स्क्रिप्ट में: इको शेल कमांड्स के रूप में वे निष्पादित होते हैं (यह सिर्फ एक उबंटू-विशिष्ट समाधान नहीं है)।

आपको जो करने की आवश्यकता है वह सेट कमांड का उपयोग वर्बोज़ या ऑक्स्रेस को चालू करने के लिए करें।

set -o

आप एक सूची है जो की वर्तमान मापदंडों में परिवर्तन कर रहे हैं दे देंगे पर या बंद

set -v

या लॉन्गफॉर्म संस्करण:

set -o verbose

वर्बोज़ हो जाएगा पर

मुझे लगता है कि आप जो चाहते हैं, हालांकि, वास्तव में xtrace है। यह न केवल आपके द्वारा चलाए जाने वाले प्रत्येक आदेश को प्रतिध्वनित करेगा, यह मापदंडों का विस्तार भी करेगा और आपको अधिक प्रतिक्रिया देगा। इसलिए अगर मैं टर्मिनल पर 'हाय' टाइप करने के रूप में मूर्खतापूर्ण कुछ करता हूं, तो मुझे इस बात की गूंज मिल जाएगी कि मैंने क्या टाइप किया है और साथ ही एक रिपोर्ट / ट्रेस भी किया है कि शेल ने 'हाय' को निष्पादित करने का प्रयास क्या किया है (नीचे स्क्रीनशॉट देखें) ):

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

Xtrace को सक्षम करने के लिए:

set -x

या:

set -o xtrace

इन मापदंडों को अक्षम करने के लिए, आप (प्रति-सहज रूप से) समान आदेशों को कहते हैं सिवाय एक प्लस प्रतीक के + एक डैश या माइनस प्रतीक के बजाय, उदाहरण के लिए:

set +v

क्रिया बंद कर देंगे , इसी तरह:

set +x

xtrace बंद कर देंगे ।


शेल विकल्पों पर एक विस्तृत गाइड अध्याय 33 में है । विकल्प, उन्नत बैश-स्क्रिप्टिंग गाइड


1
लेकिन कमांड सही होने पर यह कैसे काम करता है? क्या यह कोई आउटपुट देता है? आज्ञा के लिए whoami >/dev/null
पंजीकृत उपयोगकर्ता

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

मेरे जवाब पर अच्छा सूक्ष्म संपादन के लिए @PeterMortensen धन्यवाद।
बेंजामिन R

13

यह जाँचने के लिए कि क्या कुछ कमांड सफलतापूर्वक काम कर रहा है या नहीं, आप पिछली स्थिति के अनुसार दिए गए रिटर्न स्टेटस की जाँच कर सकते हैं $?:

echo $?

वापसी की स्थिति का 0मतलब है कि कमांड सफलतापूर्वक पूरा हो गया है, जबकि एक गैर-शून्य आउटपुट ( त्रुटि कोड ) का अर्थ होगा कि कुछ समस्याएं सामने आई थीं या कोई त्रुटि हुई है और श्रेणी को त्रुटि कोड से जाना जा सकता है। लिनक्स / सी त्रुटि कोड में परिभाषित कर रहे हैं /usr/include/asm-generic/errno-base.hऔर /usr/include/asm-generic/errno.h

बैश में भी, .bashrcएक उपनाम को परिभाषित करता है alertजिसका उपयोग पूरा होने की स्थिति के साथ सूचित करने के लिए किया जा सकता है। आपको इस तरह कमांड या कमांड कॉम्बो के साथ उपनाम संलग्न करना होगा:

some_command --some-switch; alert

आप अंतिम कमांड ~/.bashrcके रिटर्न स्टेटस को प्रदर्शित करने के लिए अपनी फाइल में कोड की निम्न पंक्ति को जोड़ सकते हैं ।

# show the return code of last command executed
PS1='${debian_chroot:+($debian_chroot)}\u@\h(lst ret. $(echo $?) ):\w\$ '

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

थोड़ा डेमो:

hash@precise(lst ret. 0 ):~$ ls -sh someFileThatsNotThere
ls: cannot access someFileThatsNotThere: No such file or directory
hash@precise(lst ret. 2 ):~$ 
hash@precise(lst ret. 2 ):~$ aCommandThatsNot
aCommandThatsNot: command not found
hash@precise(lst ret. 127 ):~$ 
hash@precise(lst ret. 127 ):~$ echo "you should get a lst ret. 0, I believe the system has echo installed :)"
you should get a lst ret. 0, I believe the system has echo installed :)
hash@precise(lst ret. 0 ):~$
hash@precise(lst ret. 0 ):~$ sudo touch /tmp/someTestFile
[sudo] password for hash: 
hash@precise(lst ret. 1 ):~$
hash@precise(lst ret. 1 ):~$ chown $USER:$USER /tmp/someTestFile 
chown: changing ownership of `/tmp/someTestFile': Operation not permitted

बस साथ खेल रहा है PS1:) .. थोड़ा और,

function showRetStat {
## line1: initiliazing retStat with the return status of the previous command
retStat=$?
## line2: Left padding the return status with spaces. If you prefer the unpadded one, you can just replace
# $retStatFtd in the lines initializing noErrStr and errStr among other possible ways.
retStatFtd=$(sed -e :a -e 's/^.\{1,2\}$/ &/;ta' <<< $retStat)
## lines3&4: Setting the strings to display for a successful and unsuccessful run of previous command
# which we are going to display with the prompt string. Change the strings to display text of your
# choice like you may set noErrStr="yippie!" , errStr="oopsie!" in place of what they're now.
noErrStr="retStat "$retStatFtd" :: PASS ^_^"
errStr="retStat "$retStatFtd" :: FAIL x_x"
## line5: Applying the logic and display the proper string at the prompt. Space padded number i.e. retStatFtd, here,
# worked in the logic, originally I intended to use this for the display while retStat in the conditional
# check; you could make the function one statement less if you want to.
echo "$([ $retStatFtd = 0 ] && echo "$noErrStr" || echo "$errStr")"
}

## Combining the function showRetStat into the prompt string.
PS1='${debian_chroot:+($debian_chroot)}\u@\h($(showRetStat)):\w\$ '

(आप इसे और अधिक फैंसी बनाने के लिए फ़ंक्शन को संशोधित कर सकते हैं, @gronostaj जैसी कुछ अपनी पोस्ट में करता है।)


2
मुझे वास्तव में उदाहरणों के साथ आपका विस्तारित उत्तर पसंद है। मुझे पूरा यकीन है कि ओपी xtrace चाहता है, लेकिन व्यक्तिगत रूप से मुझे अपने कमांड-लाइन कार्यक्रमों को डिबग करने के साथ-साथ दूसरों को बेहतर समझने के लिए यह उपयोगी लगेगा।
बेंजामिन आर

1
मैं सुझाव दूंगा कि रिटर्न वैल्यू पेडिंग है, ताकि यह हमेशा समान लंबाई का हो।
ओ ० '।

संशोधित करने के लिए +1 PS1। यह वही है जिसका मैं उपयोग करता हूं, त्रुटियों के मामले में लाल संख्या के साथ, अतिरिक्त कुछ नहीं अगर अंतिम आदेश सफल रहा:\[\033[01;41;37m\]${?#0}\[\033[00;01;36m\] \u@\h:\w\[\033[00m\]\$
कार्लोस कैंपड्रेस्स

1
@ जंग है कि स्रोत ~/.bashrcफ़ाइल के लिए कोई ज़रूरत नहीं है ?
अविनाश राज

2
हां, PS1 को संशोधित करना सहायक और बहुत लचीला है। मैं ^_^सफलता पर एक खुश और x_xकुछ और पर एक लाल प्रदर्शित करता हूं ।
इज़्काता

5

जब हरेक कमांड 0 और लाल X के साथ बाहर निकलता है तो आप हरी टिक साइन दिखाने के लिए अपना कमांड प्रॉम्प्ट बदल सकते हैं। आर्क लिनक्स विकी को आपके साथ जोड़ने के लिए कुछ अच्छे कोड हैं bash.rc:

set_prompt () {
    Last_Command=$? # Must come first!
    Blue='\[\e[01;34m\]'
    White='\[\e[01;37m\]'
    Red='\[\e[01;31m\]'
    Green='\[\e[01;32m\]'
    Reset='\[\e[00m\]'
    FancyX='\342\234\227'
    Checkmark='\342\234\223'

    # Add a bright white exit status for the last command
    #PS1="$White\$? "
    # If it was successful, print a green check mark. Otherwise, print
    # a red X.
    if [[ $Last_Command == 0 ]]; then
        PS1+="$Green$Checkmark "
    else
        PS1+="$Red$FancyX "
    fi
    # If root, just print the host in red. Otherwise, print the current user
    # and host in green.
    if [[ $EUID == 0 ]]; then
        PS1+="$Red\\h "
    else
        PS1+="$Green\\u@\\h "
    fi
    # Print the working directory and prompt marker in blue, and reset
    # the text color to the default.
    PS1+="$Blue\\w \\\$$Reset "
}
PROMPT_COMMAND='set_prompt'

(मैं वास्तविक त्रुटि कोड को निष्क्रिय कर दिया है क्योंकि मैं यह पसंद नहीं है, यदि आपका सटीक कोड सिर्फ हटाने देखना चाहते हैं #इस लाइन से: #PS1="$White\$? ")

यहाँ है कि यह कैसा दिखता है:

जीयूआई टर्मिनल स्क्रीनशॉट

tty स्क्रीनशॉट


2

हां , टर्मिनल पर आपके द्वारा निष्पादित प्रत्येक कमांड के लिए फीडबैक प्राप्त करना संभव है। यह इस आधार पर काम करता है कि echo $?कमांड के सफल समापन के लिए 0 और विफलता के लिए 0 के अलावा किसी अन्य मूल्य के लिए रिटर्न।

सफलता या विफलता की प्रतिक्रिया प्राप्त करने के लिए, ~/.bashrcफ़ाइल में नीचे की पंक्ति जोड़ें ।

bind 'RETURN: ";if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;\n"' 

और फिर ~/.bashrcइसे काम करने के लिए स्रोत फ़ाइल।

source ~/.bashrc

स्पष्टीकरण:

टर्मिनल पर आपके द्वारा निष्पादित प्रत्येक कमांड के लिए, यह ;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;कोड स्वचालित रूप से इसके लिए बाध्य हो जाएगा।

उदाहरण:

$ sudo apt-cache policy firefox;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;
firefox:
  Installed: 24.0+build1-0ubuntu1
  Candidate: 24.0+build1-0ubuntu1
  Version table:
 *** 24.0+build1-0ubuntu1 0
        500 http://ubuntu.inode.at/ubuntu/ saucy/main amd64 Packages
        100 /var/lib/dpkg/status
SUCCESS

$ suda apt-get update;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;
No command 'suda' found, did you mean:
 Command 'sudo' from package 'sudo-ldap' (universe)
 Command 'sudo' from package 'sudo' (main)
 suda: command not found
FAILURE

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


1
bind 'RETURN: " && echo SUCCESS || echo FAILED \n"'भी ऐसा ही करेगा, आपको [[ $? == 0 ]]स्पष्ट रूप से जांच करने की आवश्यकता नहीं है ।
souravc

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