প্রোগ্রাম কার্যকর করার পরে মুদ্রণ ফেরতের মান


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
@ মিচিড "প্রতিটি প্রাথমিক প্রম্পট দেওয়ার আগে", অতএব শেষ আদেশটি কার্যকর করা শেষ করে।
কোস

1
প্রম্পটটি প্রিন্ট হওয়ার আগে @ এমচিড এটি চালায় - সুতরাং আপনি পরবর্তী কমান্ডটি টাইপ করার আগে।
মারু

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কমান্ড ব্যর্থ হয়েছে তা জানতে আউটপুটটিতে হলুদ রঙের জন্য আমাকে কেবল নজর রাখা দরকার ।

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