কি করে
echo $?
শেল প্রোগ্রামিং মানে?
কি করে
echo $?
শেল প্রোগ্রামিং মানে?
উত্তর:
এটিই শেষ সম্পাদিত কমান্ডের প্রস্থান স্থিতি।
উদাহরণস্বরূপ কমান্ড true
সর্বদা একটি স্থিতি দেয় 0
এবং false
সর্বদা এর স্থিতি প্রদান করে 1
:
true
echo $? # echoes 0
false
echo $? # echoes 1
ম্যানুয়াল থেকে: ( man bash
আপনার শেল কল করে অ্যাক্সেসযোগ্য )
$?
সর্বাধিক সম্পাদিত সম্পাদিত অগ্রভাগের পাইপলাইনটির প্রস্থান স্থিতিতে প্রসারিত।
কনভেনশন দ্বারা 0
সাফল্যের একটি প্রস্থান স্থিতি , এবং শূন্য -হীন রিটার্ন স্থিতি মানে ব্যর্থতা। উইকিপিডিয়ায় প্রস্থান স্থিতি সম্পর্কে আরও জানুন ।
আপনি যেমন এই অনলাইন ম্যানুয়ালটিতে দেখতে পারেন এর মতো অন্যান্য বিশেষ ভেরিয়েবল রয়েছে: https://www.gnu.org/s/bash/manual/bash.html# স্পেশাল- প্যারামিটার
$
এবং ?
দুটি স্বতন্ত্র পরামিতি এবং $?
ব্যাশ (1) ম্যানপেজে প্রদর্শিত হয় না।
$?
শেষ সম্পাদিত কমান্ডের প্রস্থান মান প্রদান করে। echo $?
কনসোল এ মান মুদ্রণ। শূন্য একটি সফল সম্পাদন বোঝায় যখন অ-শূন্য মানগুলি ব্যর্থতার জন্য বিভিন্ন কারণে ম্যাপ করা হয়।
সুতরাং স্ক্রিপ্টিং যখন; আমি নিম্নলিখিত বাক্য গঠন ব্যবহার করার ঝোঁক
if [ $? -eq 0 ]; then
# do something
else
# do something else
fi
তুলনা সমান সমান 0
বা না সমান উপর করা উচিত 0
।
** আপডেট মন্তব্যের উপর ভিত্তি করে: আদর্শভাবে, আপনার তুলনা করার জন্য উপরের কোড ব্লকটি ব্যবহার করা উচিত নয়, @ ট্রিপলির মন্তব্য এবং ব্যাখ্যাটি দেখুন।
cmd; if [ $? -eq 0 ]; then
তা রিফ্যাক্ট করা উচিত if cmd; then
। খুব উদ্দেশ্য এর if
(এবং শেল অন্যান্য প্রবাহ নিয়ন্ত্রণ বিবৃতি) একটি কমান্ডটি প্রয়োগ এবং তার প্রস্থানের অবস্থা পরীক্ষা করা।
if cmd;
খুব পঠনযোগ্য নাও হতে পারে কিছু শর্ত বিশেষত যখন সেন্টিমিডে অন্য স্ক্রিপ্টকে বোঝায়।
[ 1 ]
এবং [ 0 ]
উভয়ই সত্য; [
কোনও অপারেটর ছাড়াই আর্গুমেন্টটি একটি খালি স্ট্রিং কিনা তা পরীক্ষা করে।
vendor/bin/drush status bootstrap | grep -q $(vendor/bin/drush php-eval 'if (function_exists("t")) echo t("Successful");') &> /dev/null;
। যদি আমি if [ ... ]
এটি একটি এক লাইনে রেখেছিলাম তবে এটি মারাত্মকভাবে অপঠনযোগ্য হবে। আমি সেই লাইনের আউটপুটটি একটি ভেরিয়েবলে সঞ্চয় করার পরিকল্পনা করছি যাতে আমি if [ $drupal_installed -eq 0 ]
পরে বলতে পারি ।
প্রতিধ্বনি $? - সর্বাধিক কার্যকর হওয়া কমান্ডের প্রস্থান স্থিতি দেয় । এই প্রস্থান স্থিতিটি সম্ভবত জিরো সাফল্য এবং ব্যর্থতার ইঙ্গিত দেয় এমন কোনও নন-জিরো মান সহ একটি সংখ্যা হবে probably
? - এটি ব্যাশের একটি বিশেষ পরামিতি / পরিবর্তনশীল।
$? - এটি ভেরিয়েবল "?" এ সঞ্চিত মান দেয়।
বেসে কিছু অনুরূপ বিশেষ পরামিতিগুলি 1,2, *, # (সাধারণত প্রতিধ্বনি কমান্ডে $ 1, $ 2, $ *, $ #, ইত্যাদি হিসাবে দেখা যায়)।
এটিতে একটি কমান্ডের সর্বশেষ স্থিতি কোড (প্রস্থান মান) রয়েছে।
ন্যূনতম পসিক্স সি প্রস্থান স্থিতির উদাহরণ
বুঝতে $?
, আপনাকে প্রথমে প্রসেসের প্রস্থান স্থিতির ধারণাটি বুঝতে হবে যা পসিক্স দ্বারা সংজ্ঞায়িত করা হয়েছে । লিনাক্সে:
যখন কোনও প্রক্রিয়া exit
সিস্টেম কলকে কল করে, কার্নেল int
প্রক্রিয়াটি মারা যাওয়ার পরেও সিস্টেম কল (এ ) এর কাছে দেওয়া মান সংরক্ষণ করে ।
প্রস্থান সিস্টেম কলটি exit()
এএনএসআই সি ফাংশন দ্বারা ডাকা হয় এবং আপনি যখন return
থেকে আসেন তখন পরোক্ষভাবে main
।
প্রসেসটি যে প্রস্থানকারী চাইল্ড প্রসেস (বাশ) নামে পরিচিত, প্রায়শই fork
+ exec
সহ wait
সিস্টেম কলের মাধ্যমে সন্তানের প্রস্থান স্থিতি ফিরে পেতে পারে
বাশ কোডটি বিবেচনা করুন:
$ false
$ echo $?
1
সি "সমতুল্য" হ'ল:
false.c
#include <stdlib.h> /* exit */
int main(void) {
exit(1);
}
bash.c
#include <unistd.h> /* execl */
#include <stdlib.h> /* fork */
#include <sys/wait.h> /* wait, WEXITSTATUS */
#include <stdio.h> /* printf */
int main(void) {
if (fork() == 0) {
/* Call false. */
execl("./false", "./false", (char *)NULL);
}
int status;
/* Wait for a child to finish. */
wait(&status);
/* Status encodes multiple fields,
* we need WEXITSTATUS to get the exit status:
* http://stackoverflow.com/questions/3659616/returning-exit-code-from-child
**/
printf("$? = %d\n", WEXITSTATUS(status));
}
সংকলন এবং চালান:
g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o bash bash.c
g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o false false.c
./bash
আউটপুট:
$? = 1
বাশ-এ, আপনি যখন এন্টার টিপুন, উপরে কাঁটাচামচ করা + এক্সিকিউট + ওয়েট হবে উপরের মতো, এবং ব্যাশ তার পরে $?
কাঁটাচামচ প্রক্রিয়ার প্রস্থান স্থিতিতে সেট করে।
দ্রষ্টব্য: অন্তর্নির্মিত কমান্ডগুলির মতো echo
, কোনও প্রক্রিয়া তৈরি করা দরকার না এবং $?
বাহ্যিক প্রক্রিয়া অনুকরণের জন্য বাশ কেবল 0 এ সেট করে।
স্ট্যান্ডার্ড এবং ডকুমেন্টেশন
পজিক্স 7 2.5.2 "বিশেষ পরামিতি" http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_05_02 :
? সর্বাধিক সাম্প্রতিক পাইপলাইনের দশমিক প্রস্থান স্থিতিতে প্রসারিত (পাইপলাইন দেখুন)।
man bash
"বিশেষ পরামিতি":
শেলটি বেশ কয়েকটি পরামিতি বিশেষভাবে বিবেচনা করে। এই পরামিতিগুলি কেবল রেফারেন্স করা যেতে পারে; তাদের নিয়োগের অনুমতি নেই allowed [...]
? সর্বাধিক সম্পাদিত সম্পাদিত অগ্রভাগের পাইপলাইনটির প্রস্থান স্থিতিতে প্রসারিত।
এএনএসআই সি এবং পসিক্স তারপরে সুপারিশ করুন:
0
মানে প্রোগ্রামটি সফল হয়েছিল
অন্যান্য মান: প্রোগ্রামটি কোনওভাবে ব্যর্থ হয়েছিল।
সঠিক মান ব্যর্থতার ধরণটি নির্দেশ করতে পারে।
এএনএসআই সি কোনও ভোজের অর্থ সংজ্ঞায়িত করে না, এবং পসিক্স 125 এর চেয়ে বড় মান নির্দিষ্ট করে: "পসিক্স" এর অর্থ কী?
বাশ এর জন্য প্রস্থান স্থিতি ব্যবহার করে if
বাশ-এ, আমরা প্রায়শই $?
নিচের মত if
বিবৃতি নিয়ন্ত্রণ করতে প্রস্থান স্থিতিটি স্পষ্টভাবে ব্যবহার করি :
if true; then
:
fi
true
একটি প্রোগ্রাম যেখানে কেবল 0 প্রদান করে।
উপরের সমতুল্য:
true
result=$?
if [ $result = 0 ]; then
:
fi
এবং ভিতরে:
if [ 1 = 1 ]; then
:
fi
[
একটি অদ্ভুত নাম (এবং বাশ অন্তর্নির্মিত এটির মতো আচরণ করে) সহ কেবল একটি প্রোগ্রাম এবং 1 = 1 ]
এর যুক্তিগুলিও দেখুন: বাশের একক এবং ডাবল বর্গাকার বন্ধনীগুলির মধ্যে পার্থক্য
Http://www.gnu.org/s/bash/manual/bash.html# স্পেশাল- প্যারামিটার থেকে
?
Expands to the exit status of the most recently executed foreground pipeline.
3.4.2 বিশেষ প্যারামিটারের অধীনে বাশ ম্যানুয়ালটি দেখুন :
? - সর্বাধিক সম্পাদিত সম্পাদিত অগ্রভাগের পাইপলাইনটির প্রস্থান স্থিতিতে প্রসারিত।
এটি খুঁজে পাওয়া একটু কঠিন কারণ এটি তালিকাভুক্ত নয় $?
(পরিবর্তনশীল নামটি "ন্যায়সঙ্গত" ?
)। আরো দেখুন প্রস্থান অবস্থা অধ্যায়, অবশ্যই ;-)
শুভ কোডিং।