Meaning এর অর্থ? শেল স্ক্রিপ্টগুলিতে (ডলার প্রশ্ন চিহ্ন)


উত্তর:


212

এটিই শেষ সম্পাদিত কমান্ডের প্রস্থান স্থিতি।

উদাহরণস্বরূপ কমান্ড 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) ম্যানপেজে প্রদর্শিত হয় না।
জোশ হাবদাস

19

$?শেষ সম্পাদিত কমান্ডের প্রস্থান মান প্রদান করে। echo $?কনসোল এ মান মুদ্রণ। শূন্য একটি সফল সম্পাদন বোঝায় যখন অ-শূন্য মানগুলি ব্যর্থতার জন্য বিভিন্ন কারণে ম্যাপ করা হয়।

সুতরাং স্ক্রিপ্টিং যখন; আমি নিম্নলিখিত বাক্য গঠন ব্যবহার করার ঝোঁক

if [ $? -eq 0 ]; then
 # do something
else
 # do something else
fi

তুলনা সমান সমান 0বা না সমান উপর করা উচিত 0

** আপডেট মন্তব্যের উপর ভিত্তি করে: আদর্শভাবে, আপনার তুলনা করার জন্য উপরের কোড ব্লকটি ব্যবহার করা উচিত নয়, @ ট্রিপলির মন্তব্য এবং ব্যাখ্যাটি দেখুন।


15
না, এটি একটি অ্যান্টিপ্যাটার্ন। যা কিছু দেখতে লাগে cmd; if [ $? -eq 0 ]; thenতা রিফ্যাক্ট করা উচিত if cmd; then। খুব উদ্দেশ্য এর if(এবং শেল অন্যান্য প্রবাহ নিয়ন্ত্রণ বিবৃতি) একটি কমান্ডটি প্রয়োগ এবং তার প্রস্থানের অবস্থা পরীক্ষা করা।
ট্রিপলি

if cmd;খুব পঠনযোগ্য নাও হতে পারে কিছু শর্ত বিশেষত যখন সেন্টিমিডে অন্য স্ক্রিপ্টকে বোঝায়।
সৌরভ আরিয়ান

1
এটি এখন আরও বেশি ভুল। [ 1 ]এবং [ 0 ]উভয়ই সত্য; [কোনও অপারেটর ছাড়াই আর্গুমেন্টটি একটি খালি স্ট্রিং কিনা তা পরীক্ষা করে।
ট্রিপলি

2
আমি করতে চলেছি 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 ]পরে বলতে পারি ।
থার্ডেন্ডার

1
@ থার্ডেন্ডার এটির সঠিক সমাধানটি শেল ফাংশনটিতে জটিল পরীক্ষাটি encapsulate করা।
ট্রিপলি

12

প্রতিধ্বনি $? - সর্বাধিক কার্যকর হওয়া কমান্ডের প্রস্থান স্থিতি দেয় । এই প্রস্থান স্থিতিটি সম্ভবত জিরো সাফল্য এবং ব্যর্থতার ইঙ্গিত দেয় এমন কোনও নন-জিরো মান সহ একটি সংখ্যা হবে probably

? - এটি ব্যাশের একটি বিশেষ পরামিতি / পরিবর্তনশীল।

$? - এটি ভেরিয়েবল "?" এ সঞ্চিত মান দেয়।

বেসে কিছু অনুরূপ বিশেষ পরামিতিগুলি 1,2, *, # (সাধারণত প্রতিধ্বনি কমান্ডে $ 1, $ 2, $ *, $ #, ইত্যাদি হিসাবে দেখা যায়)।



5

ন্যূনতম পসিক্স সি প্রস্থান স্থিতির উদাহরণ

বুঝতে $?, আপনাকে প্রথমে প্রসেসের প্রস্থান স্থিতির ধারণাটি বুঝতে হবে যা পসিক্স দ্বারা সংজ্ঞায়িত করা হয়েছে । লিনাক্সে:

  • যখন কোনও প্রক্রিয়া 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 ]এর যুক্তিগুলিও দেখুন: বাশের একক এবং ডাবল বর্গাকার বন্ধনীগুলির মধ্যে পার্থক্য



3

3.4.2 বিশেষ প্যারামিটারের অধীনে বাশ ম্যানুয়ালটি দেখুন :

? - সর্বাধিক সম্পাদিত সম্পাদিত অগ্রভাগের পাইপলাইনটির প্রস্থান স্থিতিতে প্রসারিত।

এটি খুঁজে পাওয়া একটু কঠিন কারণ এটি তালিকাভুক্ত নয় $?(পরিবর্তনশীল নামটি "ন্যায়সঙ্গত" ?)। আরো দেখুন প্রস্থান অবস্থা অধ্যায়, অবশ্যই ;-)

শুভ কোডিং।


2

সর্বশেষ কার্যকর করা ইউনিক্স কমান্ডের ফলাফল আউটপুট করে

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