যদি তারা কাজ করে বা কাজ না করে তবে আমি সমস্ত কমান্ডের প্রতিক্রিয়া জানাতে পারি?


11

কখনও কখনও যখন আমি কমান্ডগুলি চালনা করি এটি কোনও আউটপুট প্রদর্শন করে না, সুতরাং তারা নিশ্চিত হয়ে কাজ করেছে কি না তা আমি নিশ্চিত নই। সমস্ত কমান্ডের প্রতিক্রিয়া করা কি সম্ভব যদি তারা সঠিকভাবে দৌড়েছে বা না? অথবা তারা দৌড়ে গেছে প্রতিক্রিয়া আইডি প্রদর্শন করার জন্য খালি ন্যূনতম সময়ে (সঠিকভাবে বা না)


6
সাধারণ ধারণাটি হ'ল: কোনও প্রতিক্রিয়া নয় মানে এটি কাজ করেছিল worked
রিঞ্জউইন্ড

1
এটা ঠিক সত্য নয়। উদাহরণস্বরূপ, cryptsetupডিফল্টরূপে কিছু ত্রুটি বার্তা এড়িয়ে যেতে পারে। $?আপনার মধ্যে রাখা ভাল জিনিস PS1। পরবর্তী পদক্ষেপটি হ'ল বর্তমান সময়কে যুক্ত করা, কমান্ডের সময় সম্পর্কে সর্বদা জানতে;)
d33tah

উত্তর:


11

(আমি মনে করি আপনি যেহেতু উবুন্টুকে জিজ্ঞাসা করুন ভিতরে পোস্ট করছেন আমরা ধরে নিতে পারি যে আপনি ডিফল্ট শেল, অর্থাৎ বাশ সম্পর্কে কথা বলছেন ))

স্ট্যাক ওভারফ্লো প্রশ্নে একটি খুব ভাল উত্তর রয়েছে শেল স্ক্রিপ্টে: ইকো শেল কমান্ডগুলি কার্যকর করা হয় (এটি কেবল একটি উবুন্টু-নির্দিষ্ট সমাধান নয়)।

আপনার যা করা দরকার তা হ'ল ভারবোস বা xtrace চালু করতে সেট কমান্ডটি ব্যবহার করুন।

set -o

আপনি একটি তালিকা যার বর্তমান পরামিতি স্যুইচ করা হয় দেব উপর বা বন্ধ

set -v

বা লংফর্ম সংস্করণ:

set -o verbose

ভার্বোস চালু হবে

আমার মনে হয় আপনি যা চান তা আসলে অক্সট্রেস। এটি কেবল আপনার চালানো প্রতিটি আদেশ প্রতিধ্বনিত করবে না, এটি পরামিতিগুলি প্রসারিত করবে এবং আপনাকে আরও প্রতিক্রিয়া জানাবে। সুতরাং আমি যদি টার্মিনালে 'হাই' টাইপ করার মতো নির্বোধ কিছু করি তবে আমি কী টাইপ করেছি তার প্রতিধ্বনি এবং শেল 'হাই' কমান্ডটি কার্যকর করার চেষ্টা করে শেল কী করেছে তার রিপোর্ট / ট্রেস পেয়ে যাব (নীচের স্ক্রিনশটটি দেখুন ):

এখানে চিত্র বিবরণ লিখুন

Xtrace সক্ষম করতে:

set -x

বা:

set -o xtrace

এই প্যারামিটারগুলি অক্ষম করতে, আপনি (পাল্টা স্বজ্ঞাত) ড্যাশ বা বিয়োগ চিহ্নের পরিবর্তে প্লাস চিহ্ন + ছাড়া একই কমান্ডগুলি কল করেন , উদাহরণস্বরূপ:

set +v

ক্রিয়াপদ বন্ধ হবে , একইভাবে:

set +x

xtrace বন্ধ হবে


শেল অপশন সম্পর্কিত একটি বিশদ গাইড অধ্যায় 33-এ রয়েছে Options বিকল্পগুলি, উন্নত বাশ-স্ক্রিপ্টিং গাইড


1
কমান্ডটি সঠিক হলে এটি কীভাবে কাজ করবে? এটি কোন আউটপুট দেয়? কমান্ডের জন্য বলুন whoami >/dev/null
ব্যবহারকারী

হ্যাঁ, অবশ্যই এটি করা হয়, এটি আপনার প্রতিপাদকটি কমান্ডের সাথে জড়িত কোনও অতিরিক্ত পরামিতি যুক্ত যা অতিরিক্ত টাইপ করেছিল তা প্রতিধ্বনি দেয়। যদি আপনি বোঝাতে চান, এটি কি "সাফল্য" মুদ্রণ করে, তবে দুঃখের বিষয়, না, অবিনাশ রাজের উত্তরটি তা করবে।
বেনিয়ামিন আর

@ পিটারমোরটেনসেন আমার উত্তরে সুন্দর সূক্ষ্ম সম্পাদনার জন্য ধন্যবাদ।
বেনিয়ামিন আর

13

কোনও কমান্ড সফলভাবে কাজ করেছে কি না তা পরীক্ষা করতে আপনি পূর্ববর্তী কমান্ডের দ্বারা প্রদত্ত রিটার্নের স্থিতি পরীক্ষা করতে পারেন$? :

echo $?

রিটার্নের স্থিতি 0মানে কমান্ডটি সাফল্যের সাথে সম্পন্ন হয়েছে, যখন একটি শূন্য-আউটপুট ( ত্রুটি কোড ) এর অর্থ হবে কিছু সমস্যা হয়েছে বা ত্রুটি রয়েছে এবং ত্রুটি কোড থেকে বিভাগটি জানা যাবে can লিনাক্স / সি ত্রুটি কোডের মধ্যে সংজ্ঞায়িত করা হয় /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আপনার পছন্দের টেক্সট এডিটরের সাহায্যে ফাইলটি খুলুন , এবং উপরের লাইনটি অনুলিপি করুন, ফাইলটিতে এটি আটকে দিন এবং সংরক্ষণ করুন the টার্মিনালের একটি নতুন উদাহরণ চালু করুন, এবং এটি কার্যকরভাবে করা উচিত Or এটি 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\$ '

(আপনি আরও বেশি অভিনব করে তুলতে ফাংশনটি সংশোধন করতে পারেন, @ গ্রোনস্টাজ তার পোস্টে এমন কিছু করে))


2
আমি উদাহরণ সহ আপনার বর্ধিত উত্তরটি পছন্দ করি। আমি ওপেনটি অ্যাক্ট্রেস চাইতে নিশ্চিত, তবে ব্যক্তিগতভাবে আমি নিজের কমান্ড-লাইন প্রোগ্রামগুলি ডিবাগ করার পাশাপাশি অন্যকে আরও ভাল বোঝার জন্য এটি দরকারী বলে মনে করি।
বেনিয়ামিন আর

1
আমি রিটার্ন মানটি বাম-প্যাডিংয়ের পরামর্শ দেব, যাতে এটি সর্বদা একই দৈর্ঘ্য হয়।
o0 '

সংশোধন করার জন্য +1 PS1। এটিই আমি ব্যবহার করি, ত্রুটির ক্ষেত্রে লাল সংখ্যা সহ, শেষ কমান্ডটি সফল হলে অতিরিক্ত কিছু নয়:\[\033[01;41;37m\]${?#0}\[\033[00;01;36m\] \u@\h:\w\[\033[00m\]\$
কার্লোস ক্যাম্প্ডার এর

1
@ রিস্টি ~/.bashrcফাইলের দরকার নেই ?
অবিনাশ রাজ

2
হ্যাঁ, পিএস 1 সংশোধন করা সহায়ক এবং খুব নমনীয়। আমি ^_^সাফল্যের জন্য একটি খুশি এবং x_xঅন্য কিছুতে একটি লাল প্রদর্শন করি ।
ইজকাটা

5

পূর্ববর্তী কমান্ডটি 0 এবং লাল এক্স দিয়ে অন্য কোনও ক্ষেত্রে প্রস্থান করলে আপনি সবুজ টিক চিহ্নটি প্রদর্শন করতে আপনার কমান্ড প্রম্পটটি পরিবর্তন করতে পারেন। আর্ক লিনাক্স উইকির কাছে আপনার যুক্ত করার জন্য কয়েকটি দুর্দান্ত কোড রয়েছে 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

হ্যাঁ , আপনি টার্মিনালে চালিত প্রতিটি কমান্ডের প্রতিক্রিয়া পাওয়া সম্ভব t এটি echo $?কমান্ডের সফল সমাপ্তির জন্য 0 এবং ব্যর্থতার জন্য 0 ব্যতীত অন্য কোনও মানের ভিত্তিতে 0 প্রদান করে works

সাফল্য বা ব্যর্থতার প্রতিক্রিয়া পেতে, ~/.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 ]]স্পষ্টভাবে চেক করার দরকার নেই ।
সৌরভসি

তবে সি / লিনাক্স স্ট্যান্ডার্ড এবং ইংরেজী ব্যাকরণ মান 'সাফল্যের' প্রতিরূপ ব্যর্থ হবে।
বেনিয়ামিন আর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.