শেল স্ক্রিপ্টগুলির প্রস্থান স্থিতির জন্য "সংরক্ষিত" কোড ব্যবহার করা


15

আমি সম্প্রতি অ্যাডভান্সড ব্যাশ-স্ক্রিপ্টিং গাইড থেকে বিশেষ অর্থ সহ প্রস্থান কোডগুলির এই তালিকাটি জুড়ে এসেছি । তারা এই কোডগুলি সংরক্ষিত হিসাবে উল্লেখ করে এবং এটি সুপারিশ করে:

উপরের টেবিল অনুসারে, প্রস্থান কোডগুলি 1-2, 126-165 এবং 255 এর বিশেষ অর্থ রয়েছে এবং তাই ব্যবহারকারী-নির্দিষ্ট প্রস্থান পরামিতিগুলির জন্য এড়ানো উচিত।

কিছুক্ষণ আগে, আমি একটি স্ক্রিপ্ট লিখেছিলাম যা নিম্নলিখিত প্রস্থান স্থিতি কোডগুলি ব্যবহার করে:

  • 0 - সাফল্য
  • 1 - ভুল হোস্ট-নেম
  • 2 - অবৈধ যুক্তি নির্দিষ্ট করা আছে
  • 3 - অপর্যাপ্ত ব্যবহারকারী সুবিধা

আমি যখন স্ক্রিপ্টটি লিখেছিলাম তখন আমি কোনও বিশেষ প্রস্থান কোড সম্পর্কে অবগত ছিলাম না তাই আমি প্রথম ত্রুটি শর্তের জন্য কেবল 1 এ শুরু করেছিলাম এবং প্রতিটি ক্রমাগত ত্রুটির ধরণের জন্য প্রস্থান স্থিতি বাড়িয়েছি।

আমি স্ক্রিপ্টটি এই উদ্দেশ্য নিয়ে লিখেছিলাম যে পরবর্তী পর্যায়ে এটিকে অন্যান্য স্ক্রিপ্টগুলি কল করতে পারে (যা শূন্য-বহির্গমন প্রস্থান কোডগুলির জন্য পরীক্ষা করতে পারে)। আমি আসলে এখনও এটি করেন নি; এখনও অবধি আমি কেবলমাত্র আমার ইন্টারেক্টিভ শেল (বাশ) থেকে স্ক্রিপ্টটি চালিয়েছি এবং আমি ভাবছিলাম যে আমার কাস্টম বহির্গমন কোডগুলি ব্যবহার করে কোনও সমস্যা কি হতে পারে। অ্যাডভান্সড ব্যাশ-স্ক্রিপ্টিং গাইডের সুপারিশটি কতটা প্রাসঙ্গিক / গুরুত্বপূর্ণ?

আমি বাশ ডকুমেন্টেশনে কোনও সংশোধন পরামর্শ খুঁজে পাইনি; প্রস্থান স্থিতির এর বিভাগটি কেবল ব্যাশের দ্বারা ব্যবহৃত প্রস্থান কোডগুলি তালিকাভুক্ত করে তবে তা বর্ণিত হয় না যে এগুলির কোনওটি সংরক্ষিত আছে বা সেগুলি আপনার নিজের স্ক্রিপ্ট / প্রোগ্রামগুলির জন্য ব্যবহার করার বিরুদ্ধে সতর্ক করে দিয়েছে।


6
আমি এবং অন্যান্যরা ABSG কে সাধারণত নিম্ন মানের বলে বিবেচনা করি। আমার মতে আপনার লিঙ্ক করা পৃষ্ঠার লেখক একটি অসমর্থিত দৃ making়তার সাথে দাবি করছেন যে তালিকাভুক্ত প্রস্থান কোডগুলি শেল নিজেই নির্দিষ্ট অর্থগুলির জন্য সেগুলি ব্যবহার করে এমন ভিত্তিতে সংরক্ষিত রয়েছে। স্ক্রিপ্টগুলির জন্য মানদণ্ড তৈরি করার চেষ্টা করা হয়েছে, যার কোনওটিরই সাফল্য হয়নি। গুরুত্বপূর্ণ বিষয়টি হ'ল আপনি যে ত্রুটি কোডগুলি চয়ন করেন তা নথিভুক্ত করা যাতে আপনার স্ক্রিপ্টগুলির গ্রাহকরা (যেমন অন্যান্য স্ক্রিপ্টগুলি) তাদের উপর ভিত্তি করে কী করবেন তা জানতে পারে।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

@ ডেনিসউইলিইমসন যদি আপনি উত্তর হিসাবে আপনার মন্তব্য পোস্ট করেন তবে আমি এটি উত্সাহিত করতে পেরে খুশি হব; আমি ইতিমধ্যে অন্যান্য সমস্ত উত্তরকে ভোট দিয়েছি কারণ আমি তাদের প্রত্যেককে দরকারী বলে মনে করেছি। যদিও আপনার উত্তরটি ডেভিড কিং-এর (এবং কিছুটা হলেও জওয়োলের) সামগ্রীর সাথে সমান, তবে আপনি স্পষ্ট করেই বলেছেন যে এবিএসজি উদ্ধৃতিতে দৃser়তার প্রমাণ নেই।
অ্যান্টনি জি - মনিকার পক্ষে ন্যায়বিচার

1
অফারটির জন্য ধন্যবাদ, তবে আমি বিশ্বাস করি যে আমার মন্তব্যটি যেমন থাকা উচিত।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

আমি তখন থেকেই আবিষ্কার করেছি যে পসিক্স স্পেসিফিকেশনটিতে একই জাতীয় পরামর্শ অন্তর্ভুক্ত রয়েছে তাই আমি সেই তথ্যটি আমার নিজের উত্তরে যুক্ত করেছি (এই প্রশ্নটি জিজ্ঞাসা করার পর থেকে আমার গবেষণার ফলাফলগুলি সহ)।
অ্যান্টনি জি - মনিকার

উত্তর:


10

প্রক্রিয়া থেকে বেরিয়ে আসার কোডগুলির অর্থ মানিক করার জন্য বেশ কয়েকটি প্রচেষ্টা হয়েছে। আপনি যা উল্লেখ করেছেন তা ছাড়াও, আমি জানি:

  • বিএসডিগুলিতে রয়েছে sysexits.hযা 64৪ থেকে বেশি পর্যন্ত মানগুলির অর্থ সংজ্ঞা দেয়।

  • জিএনইউ grepনথি যা প্রস্থান কোড 0 এর অর্থ কমপক্ষে একটি মিল খুঁজে পাওয়া গেছে, 1 এর অর্থ কোনও মিল খুঁজে পাওয়া যায় নি, এবং 2 এর অর্থ একটি আই / ও ত্রুটি ঘটেছে; এই সম্মেলনটি অবশ্যই অন্যান্য প্রোগ্রামগুলির জন্যও কার্যকর, যার জন্য "কিছুই ভুল হয়নি তবে আমি কিছুই পাইনি" এবং "একটি আই / ও ত্রুটি ঘটেছে" এর মধ্যে পার্থক্যটি অর্থবহ।

  • সি লাইব্রেরির ফাংশনটির অনেকগুলি বাস্তবায়ন systemপ্রোগ্রামটি বিদ্যমান নয় বা শুরু করতে ব্যর্থ হয় তা নির্দেশ করতে প্রস্থান কোড 127 ব্যবহার করে।

  • উইন্ডোজে, NTSTATUSকোডগুলি (যা 32-বিট সংখ্যা জুড়ে অসুবিধাজনিতভাবে ছড়িয়ে ছিটিয়ে থাকে) প্রস্থান কোড হিসাবে ব্যবহৃত হতে পারে, বিশেষত যেগুলি নির্দেশ করে যে বিপর্যয়মূলক আচরণের কারণে (যেমন STATUS_STACK_OVERFLOW) কোনও প্রক্রিয়াটি সমাপ্ত হয়েছিল ।

আপনি এই কনভেনশনগুলির যে কোনও একটি নির্দিষ্টভাবে মান্য কোনও প্রদত্ত প্রোগ্রামের উপর নির্ভর করতে পারবেন না। একমাত্র নির্ভরযোগ্য নিয়ম হ'ল প্রস্থান কোড 0 সাফল্য এবং অন্য যে কোনও কিছু হ'ল ব্যর্থতা। (নোট যে C89 এর EXIT_SUCCESSহয় না মান শূন্য আছে নিশ্চিত, যাইহোক, exit(0)অনুরূপ আচরণ করে প্রয়োজন বোধ করা হয় exit(EXIT_SUCCESS)। এমনকি যদি মান একই হয় না)


ধন্যবাদ। অন্যের উপরে একটি উত্তর চয়ন করা কঠিন ছিল তবে আমি এই উত্তরটি গ্রহণ করছি যেহেতু এটি আমার প্রশ্নের উত্তর দিয়েছে এবং ব্যবহারের ক্ষেত্রে বিভিন্ন প্রস্থানীয় কোডের প্রাসঙ্গিক স্বাদ সরবরাহ করে (প্রাসঙ্গিক লিঙ্কগুলি সহ): এটি 3 টিরও বেশি উন্নয়নের দাবিদার বর্তমানে আছে
অ্যান্টনি জি - মনিকার

11

কোনও প্রস্থান কোডের একটি বিশেষ অর্থ নেই, তবে এর মানটির $?একটি বিশেষ অর্থ হতে পারে।

শর্ন ভেরিয়েবলের বোর্ন শেল এবং ksh93 যেভাবে পরিচালনা এবং প্রস্থান কোড এবং ত্রুটির পরিস্থিতি ফরোয়ার্ড করা হয়েছে তা $?হ'ল সমস্যা। আপনি যা তালিকাভুক্ত করেছেন তার বিপরীতে কেবলমাত্র নিম্নলিখিত মানগুলির $?একটি বিশেষ অর্থ রয়েছে:

  • 126 বাইনারি উপস্থিত থাকলেও কার্যকর করতে পারেনি
  • 127 নির্দিষ্ট বাইনারি উপস্থিত নেই
  • 128 প্রস্থান স্থিতি ছিল == 0 তবে কিছু অনির্দিষ্ট সমস্যা বিদ্যমান

তদতিরিক্ত, একটি অনির্দিষ্ট শেল এবং প্ল্যাটফর্ম-নির্দিষ্ট $?কোডের রেঞ্জ > 128 রয়েছে যা একটি প্রোগ্রামের জন্য সংরক্ষিত যা সংকেত দ্বারা বাধাগ্রস্ত হয়েছিল:

  • বোর্ন শেল ব্যাশ এবং ksh88 128 + সিগন্যাল নম্বর ব্যবহার করে
  • ksh93 256 + সিগন্যাল নম্বর ব্যবহার করে।

অন্যান্য মানগুলি শেল-বিশেষ $?মানের থেকে পৃথক হতে পারে বলে সমস্যা দেয় না ।

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

বোর্ন শেলের নতুন সংস্করণগুলি প্রোগ্রামটি থেকে বেরিয়ে আসার অপেক্ষা রাখার waitid()পরিবর্তে ব্যবহার করে waitpid()এবং waitid()(এসভিআর 4 এর জন্য 1989 প্রবর্তিত) আরও ভাল একটি সিস্কেল ইন্টারফেস ব্যবহার করে (ইউএনওএস ইতিমধ্যে ১৯৮০ সালে ব্যবহৃত একই রকম)।

হিসাবে নতুন বোর্ন শেল সংস্করণ এনকোড প্রস্থান কারণ একটি পৃথক পরিবর্তনশীল মধ্যে ${.sh.code}/ ${.sh.codename}চেয়ে প্রস্থান কোড মধ্যে যে ${.sh.status}/ ${.sh.termsig}, দেখুন http://schillix.sourceforge.net/man/man1/bosh.1.html , প্রস্থান কোড ওভারলোড করা হয় না বিশেষ রাজ্যগুলির সাথে এবং `ওয়েটিড () ব্যবহারের ফলে, বোর্ন শেল এখন প্রস্থান কোডের সমস্ত 32 বিটগুলি ফিরিয়ে আনাকে সমর্থন করে - কেবলমাত্র কম 8 বিট নয়।

বিটিডাব্লু: exit(256)কোনও সি-প্রোগ্রাম বা শেল স্ক্রিপ্ট থেকে বা এর অনুরূপ না হওয়ার বিষয়ে সতর্কতা অবলম্বন করুন , কারণ এটি $?ক্লাসিক শেলটিতে 0 হিসাবে ব্যাখ্যা করা হয়।


2
বিটিডাব্লু: আমি waitid()মে মাসের শেষের দিকে এই বাগের জন্য ফ্রিবিএসডি এবং লিনাক্স কার্নেলের বিরুদ্ধে একটি বাগ প্রতিবেদন করেছি । ফ্রিবিএসডি লোকেরা 20 ঘন্টার মধ্যে সমস্যার সমাধান করে, লিনাক্সের লোকেরা তাদের বাগ ঠিক করতে আগ্রহী নয়। ... এবং সাইগউইনের লোকেরা বলেছে যে তারা বাগ লিনাক্সের সাথে সামঞ্জস্যপূর্ণ ;-)
সহজেই

2
এই আচরণটি একক ইউনিক্স নির্দিষ্টকরণের দ্বারা প্রয়োজনীয় । হ্যাঁ একটি 32-বিট মান রয়েছে, তবে সেই মানটিতে 8-বিট বিটফিল্ড রয়েছে যা থেকে মানের 8 টি বিট থাকে _exit। আপনি উল্লেখ করছেন এমন ফ্রিবিএসডি বাগ রিপোর্টটি লিঙ্ক করুন, সম্ভবত আপনি বর্ণিত সমস্যাটিকে আমি ভুল বুঝছি।
র্যান্ডম 832

2
ওপি সঙ্গে প্রশ্ন বাঁধা ব্যাশ এবং প্রশ্ন পাঠ্যে থাকা ব্যাশ উল্লেখ করেছে। বাশ একটি বোর্ন-উত্পন্ন শেল। এটি ${.sh.}ভেরিয়েবল সমর্থন করে না । তবে এটি সত্য যে আপনি "বোর্ন" বলছেন এবং "বোর্ন-উত্পন্ন" নয় (যদিও আপনি ksh93 অন্তর্ভুক্ত করেন)।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

2
এই উত্তরটি কিছু বিশেষ SVR4- প্রাপ্ত ইউনিক্সের আপনার নির্দিষ্ট বৈকল্পিকের সাথে খুব নির্দিষ্ট বলে মনে হচ্ছে। কী বহনযোগ্য এবং কোনটি নয় সে সম্পর্কে স্পষ্ট থাকুন, মনে রাখবেন যে "" "বোর্ন শেল" এর মতো কোনও জিনিস নেই, যদি না আপনি ভি in-এ থাকা একটিকে বোঝেন না।
zwol

4
বিপরীতে, আমি বিশ্বাস করি যে আপনিই এখানে বৈচিত্রের পরিসরকে বিশেষত historicalতিহাসিক প্রকরণকে কমিয়ে দিচ্ছেন। আপনি এটিকে এমন শব্দ হিসাবে তৈরি করেন যে /bin/shএই বিশেষ প্রস্থান কোডগুলি ক্রস-প্ল্যাটফর্মের সাথে ধারাবাহিকভাবে কব্জি করার জন্য নির্ভর করা যেতে পারে, যা সত্য নয়। (আমি না যত্ন কিনা কোন বিশেষ সিস্টেমের /bin/shএকটি "বাস্তব বোর্ন শেল" হতে বলেন করা যাবে না। ঢের বেশি গুরুত্বপূর্ণ এই যে কেউই জানা POSIX, এবং যে জিনিস অধিকাংশ হিসাবে আপনি "বাস্তব ইউনিক্স সিস্টেম" cite ডন ' টি /bin/shযাইহোক একটি
পসিএক্স

6

শেল স্ক্রিপ্টিংয়ের জন্য, আমি মাঝে মাঝে sysexist.hশেল-সংরক্ষিত প্রস্থান কোডগুলির সাথে শেল সমতুল্য উত্স উত্স S_EX_করি, যা আমি নাম দিয়েছিexit.sh

এটি মূলত:

EX_OK=0 # successful termination 
EX__BASE=64     # base value for error messages 
EX_USAGE=64     # command line usage error 
EX_DATAERR=65   # data format error 
EX_NOINPUT=66   # cannot open input 
EX_NOUSER=67    # addressee unknown 
EX_NOHOST=68    # host name unknown 
EX_UNAVAILABLE=69       # service unavailable 
EX_SOFTWARE=70  # internal software error 
EX_OSERR=71     # system error (e.g., can't fork) 
EX_OSFILE=72    # critical OS file missing 
EX_CANTCREAT=73 # can't create (user) output file 
EX_IOERR=74     # input/output error 
EX_TEMPFAIL=75  # temp failure; user is invited to retry 
EX_PROTOCOL=76  # remote error in protocol 
EX_NOPERM=77    # permission denied 
EX_CONFIG=78    # configuration error 
EX__MAX=78      # maximum listed value 

#System errors
S_EX_ANY=1      #Catchall for general errors
S_EX_SH=2       #Misuse of shell builtins (according to Bash documentation); seldom seen
S_EX_EXEC=126   #Command invoked cannot execute         Permission problem or command is not an executable
S_EX_NOENT=127  #"command not found"    illegal_command Possible problem with $PATH or a typo
S_EX_INVAL=128  #Invalid argument to exit       exit 3.14159    exit takes only integer args in the range 0 - 255 (see first footnote)                                                                                        
#128+n  Fatal error signal "n"  kill -9 $PPID of script $? returns 137 (128 + 9)                               
#255*   Exit status out of range        exit -1 exit takes only integer args in the range 0 - 255              
S_EX_HUP=129                                                                                                   
S_EX_INT=130   
#...

এবং এর সাথে উত্পন্ন করা যেতে পারে:

#!/bin/sh
src=/usr/include/sysexits.h
echo "# Generated from \"$src\"" 
echo "# Please inspect the source file for more detailed descriptions"
echo
< "$src" sed -rn 's/^#define  *(\w+)\s*(\d*)/\1=\2/p'| sed 's:/\*:#:; s:\*/::'
cat<<'EOF'

#System errors
S_EX_ANY=1  #Catchall for general errors
S_EX_SH=2   #Misuse of shell builtins (according to Bash documentation); seldom seen
S_EX_EXEC=126   #Command invoked cannot execute     Permission problem or command is not an executable
S_EX_NOENT=127  #"command not found"    illegal_command Possible problem with $PATH or a typo
S_EX_INVAL=128  #Invalid argument to exit   exit 3.14159    exit takes only integer args in the range 0 - 255 (see first footnote)
#128+n  Fatal error signal "n"  kill -9 $PPID of script $? returns 137 (128 + 9)
#255*   Exit status out of range    exit -1 exit takes only integer args in the range 0 - 255
EOF
$(which kill) -l |tr ' ' '\n'| awk '{ printf "S_EX_%s=%s\n", $0, 128+NR; }'

যদিও আমি এটি খুব বেশি ব্যবহার করি না তবে আমি যা ব্যবহার করি তা হ'ল শেল ফাংশন যা ত্রুটি কোডগুলি তাদের স্ট্রিং ফর্ম্যাটগুলিতে বিপরীত করে। আমি নাম দিয়েছি exit2str। ধরে নিই যে আপনি উপরের exit.shজেনারেটরের নাম দিয়েছেন exit.sh.sh, এর জন্য কোডটি exit2str( exit2str.sh.sh) দিয়ে তৈরি করা যেতে পারে :

#!/bin/sh
echo '
exit2str(){
  case "$1" in'
./exit.sh.sh | sed -nEe's|^(S_)?EX_(([^_=]+_?)+)=([0-9]+).*|\4) echo "\1\2";;|p'
echo "
  esac
}"

আমি এটি PS1আমার ইন্টারেক্টিভ শেলের মধ্যে ব্যবহার করি যাতে আমি চালিত প্রতিটি কমান্ডের পরে আমি এর প্রস্থান স্থিতি এবং তার স্ট্রিং ফর্মটি দেখতে পাই (যদি এটির একটি পরিচিত স্ট্রিং ফর্ম থাকে):

[15:58] pjump@laptop:~ 
(0=OK)$ 
[15:59] pjump@laptop:~ 
(0=OK)$ fdsaf
fdsaf: command not found
[15:59] pjump@laptop:~ 
(127=S_NOENT)$ sleep
sleep: missing operand
Try 'sleep --help' for more information.
[15:59] pjump@laptop:~ 
(1=S_ANY)$ sleep 100
^C
[15:59] pjump@laptop:~ 
(130=S_INT)$ sleep 100
^Z
[1]+  Stopped                 sleep 100
[15:59] pjump@laptop:~ 
(148=S_TSTP)$

এগুলি পেতে, আপনার প্রস্থান 2 স্টোরের জন্য একটি ইনসার্কেবল দরকার:

$ ./exit2str.sh.sh > exit2str.sh #Place this somewhere in your PATH

এবং তারপরে ~/.bashrcপ্রতিটি কমান্ড প্রম্পটে প্রস্থান কোডটি সংরক্ষণ এবং অনুবাদ করতে এটি আপনার ব্যবহার করুন এবং এটি আপনার প্রম্পট প্রদর্শন করুন ( PS1):

    # ...
    . exit2str.sh
PROMPT_COMMAND='lastStatus=$(st="$?"; echo -n "$st"; str=$(exit2str "$st") && echo "=$str"); # ...'
    PS1="$PS1"'\n($lastStatus)\$'
    # ...                                                                                   

কিছু প্রোগ্রাম কীভাবে প্রস্থান কোড কনভেনশন অনুসরণ করে এবং কিছু না করে, প্রস্থান কোড কনভেনশন সম্পর্কে শেখার জন্য, বা আরও কী কী সহজে চলছে তা দেখতে সক্ষম হয়ে ওঠার জন্য এটি বেশ কার্যকর। এটি কিছু সময়ের জন্য ব্যবহার করার পরে, আমি বলতে পারি যে অনেক সিস্টেম-ভিত্তিক শেল স্ক্রিপ্টগুলি সম্মেলনগুলি অনুসরণ করে। EX_USAGEবিশেষত খুব সাধারণ, যদিও অন্যান্য কোডগুলি খুব বেশি না। আমি সময়ে সময়ে সম্মেলনগুলি অনুসরণ করার চেষ্টা করি, যদিও $S_EX_ANYঅলস লোকদের জন্য সর্বদা (1) আমি (আমি একজন)।


আমি ভাবছি যে এরনো কোডের সাথে ত্রুটিটি যদি ত্রুটি থেকে বেরিয়ে আসে ফলাফল হিসাবে ব্যবহার করার জন্য যদি এরোন কোড এবং ব্যবহারের জন্য একটি প্রস্থান কোডের মধ্যে ম্যাপিংয়ের মতো কিছু থাকে কিনা। আমার কিছু যুক্তিসঙ্গত ম্যাপিং নিয়ে আসতে হবে।
পিএসকোকিক

1
কি দারুন! আমি এরকম বিস্তৃত উত্তর আশা করছিলাম না। বিভিন্ন কমান্ড কীভাবে আচরণ করে তা দেখার জন্য আমি অবশ্যই এটি চেষ্টা করব। ধন্যবাদ।
অ্যান্টনি জি - মনিকার পক্ষে ন্যায়বিচার

4

যতক্ষণ আপনি আপনার প্রস্থান কোডগুলি নথিভুক্ত করেন যাতে আপনি এখন থেকে এক বছর মনে রাখবেন যখন আপনাকে ফিরে আসতে হবে এবং স্ক্রিপ্টটি টুইট করতে হবে আপনি ভাল হয়ে যাবেন। "সংরক্ষিত প্রস্থান কোড" ধারণাটি 0সাফল্য কোড এবং ব্যর্থতার কোড হিসাবে অন্য যে কোনও কিছু হিসাবে ব্যবহার করার রীতি প্রচলিত আছে তা বলার অপেক্ষা রাখে না ।


4

আমি খুঁজে পেতে পারে সবচেয়ে ভাল রেফারেন্সটি হ'ল: http://tldp.org/LDP/abs/html/exitcodes.html

এই অনুযায়ী:

1 ত্রুটিগুলির জন্য একটি সাধারণ ক্যাচল এবং আমি সর্বদা এটি ব্যবহারকারীর সংজ্ঞায়িত ত্রুটির জন্য ব্যবহার করতে দেখেছি।

2 শেল বিল্ট ইনগুলির অপব্যবহারের জন্য যেমন সিন্ট্যাক্স ত্রুটি

আপনার প্রশ্নের সরাসরি উত্তর দিতে আপনার স্ক্রিপ্টটি সংরক্ষিত ত্রুটি কোডগুলি ব্যবহার করে ঠিক হয়ে যাবে, এটি ত্রুটি কোড = 1/2/3 এর উপর ভিত্তি করে ত্রুটিটি পরিচালনা করেছেন বলে ধরে নেওয়া অনুমান হিসাবে কাজ করবে।

তবে, এটি সম্ভবত বিভ্রান্তিকর হবে যদি আপনি জেনে থাকেন এবং সংরক্ষিত ত্রুটি কোডগুলি ব্যবহার করেন এমন কোনও ব্যক্তির মুখোমুখি হন, যা বেশ বিরল বলে মনে হয়।

আপনার কাছে উপলভ্য অন্য বিকল্পটি হ'ল ত্রুটিটি প্রতিধ্বনিত হওয়া এবং তারপরে প্রস্থান করা, ধরে নেওয়া আপনার লিপিটি "কোনও সংবাদই সুসংবাদ নয়" এর লিনাক্স কনভেনশন অনুসরণ করে এবং সাফল্যের প্রতিধ্বনি কিছুই নয়।

if [ $? -ne 0 ];then
    echo "Error type"
    exit 1
fi

2

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

দেখে মনে হয় অ্যাডভান্সড বাশ-স্ক্রিপ্টিং গাইডের লেখক বিএসডি প্রস্থান কোডগুলি মানক করার চেষ্টা ( sysexits.h) এর সাথে একমত এবং কেবলমাত্র সুপারিশ করছে যে ব্যবহারকারীরা যখন শেল স্ক্রিপ্টগুলি লেখেন, তারা প্রস্থান-নির্ধারিত প্রস্থান কোডগুলির সাথে বিরোধিত হওয়া প্রস্থান কোডগুলি নির্দিষ্ট করে না already ব্যবহারে, অর্থাত্, তারা তাদের কাস্টম বহির্গমন কোডগুলি 64৪-১১১ পরিসরের 50 টি উপলব্ধ স্থিতি কোডগুলিতে সীমাবদ্ধ করে।

আমি ধারণার (এবং যুক্তি) প্রশংসা করি তবে আমি পছন্দ করতাম যদি লেখক পরামর্শটি উপেক্ষা করা ক্ষতিকারক না তবে আরও বেশি স্পষ্টভাবে দেখা যায় - যেখানে কোনও স্ক্রিপ্টের গ্রাহক যেমন 127 এর উদ্ধৃত উদাহরণ হিসাবে যেমন ত্রুটিগুলি অনুসন্ধান করছেন সেগুলি বাদ দিয়ে aside ( command not found)।

প্রাসঙ্গিক POSIX নির্দিষ্টকরণ

প্রস্থান কোড সম্পর্কে পসআইএক্স-এর কী বক্তব্য রয়েছে তা নিয়ে আমি গবেষণা করেছিলাম এবং অ্যাডভান্সড ব্যাশ-স্ক্রিপ্টিং গাইডের লেখকের সাথে পসিক্স স্পেসিফিকেশন সম্মত বলে মনে হচ্ছে। আমি প্রাসঙ্গিক POSIX নির্দিষ্টকরণ (জোর খনি) উদ্ধৃত করেছি:

কমান্ডের জন্য প্রস্থান স্থিতি

প্রতিটি কমান্ডের একটি প্রস্থান স্থিতি থাকে যা অন্যান্য শেল কমান্ডের আচরণকে প্রভাবিত করতে পারে। কমান্ডগুলির প্রস্থান স্থিতিগুলি যা ইউটিলিটি নয় তা এই বিভাগে নথিভুক্ত করা হয়েছে। মানক ইউটিলিটিগুলির প্রস্থান স্থিতি তাদের নিজ নিজ বিভাগে নথিভুক্ত করা হয়।

যদি কোনও কমান্ড না পাওয়া যায় তবে প্রস্থান স্থিতি 127 হবে। কমান্ডের নামটি পাওয়া গেলেও এটি নির্বাহযোগ্য ইউটিলিটি না হলে প্রস্থান স্থিতি 126 হবে । শেলটি ব্যবহার না করেই ইউটিলিটিগুলিকে অনুরোধ করা অ্যাপ্লিকেশনগুলির এই প্রস্থান স্থিতির মানগুলি ব্যবহার করা উচিত অনুরূপ ত্রুটি রিপোর্ট করতে।

শব্দ প্রসারণ বা পুনঃনির্দেশের সময় যদি কোনও কমান্ড ব্যর্থ হয় তবে এর প্রস্থান স্থিতি শূন্যের চেয়ে বেশি হবে।

অভ্যন্তরীণভাবে, কমান্ডটি শূন্য-বহির্গমন স্থিতির সাথে প্রস্থান করে কিনা তা নির্ধারণের উদ্দেশ্যে, শেলটি কমান্ডের জন্য অপেক্ষা () ফাংশন ওয়াক্সিটস্ট্যাটাস ম্যাক্রোর সমতুল্য (যেটি সিস্টেম ইন্টারফেস ভলিউমের সংজ্ঞায়িত করা হয়েছে) সমপরিমাণ দ্বারা প্রাপ্ত সম্পূর্ণ স্থিতির মানকে স্বীকৃতি দেবে POSIX.1-2008)। বিশেষ প্যারামিটার '?' দিয়ে প্রস্থান স্থিতি প্রতিবেদন করার সময়, শেলটি প্রস্থান স্থিতির সম্পূর্ণ আট বিটের প্রতিবেদন করবে। কমান্ডের প্রস্থান স্থিতি যা সমাপ্ত হয়েছিল কারণ এটি একটি সংকেত পেয়েছে 128 এর চেয়ে বেশি হিসাবে রিপোর্ট করা হবে।

exitউপযোগ

যেমন অন্যান্য বিভাগে ব্যাখ্যা করা হয়েছে, নির্দিষ্ট প্রস্থান স্থিতির মানগুলি বিশেষ ব্যবহারের জন্য সংরক্ষণ করা হয়েছে এবং কেবলমাত্র সেই উদ্দেশ্যে অ্যাপ্লিকেশন দ্বারা ব্যবহার করা উচিত :

  • 126 - কার্যকর করতে হবে এমন একটি ফাইল পাওয়া গেছে, তবে এটি কার্যকর করার যোগ্য ইউটিলিটি ছিল না।
  • 127 - কার্যকর করার একটি ইউটিলিটি পাওয়া যায় নি।
  • >128 - একটি কমান্ড একটি সিগন্যালের মাধ্যমে বাধা পেয়েছিল।

আরো তথ্য

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

128 এর প্রস্থান স্থিতি উত্পন্ন করার চেষ্টা করুন

বাশ সংস্করণ 3.2.25 এবং 4.2.46 ব্যবহার করে, আমি একটি 128 Invalid argument to exitত্রুটি নিক্ষেপ করার চেষ্টা করেছি তবে প্রতিবারই আমি 255 পেয়েছি (প্রস্থান ছাড়ার স্থিতি)। উদাহরণস্বরূপ, যদি exit 3.14159শেল স্ক্রিপ্টের অংশ হিসাবে বা ইন্টারেক্টিভ চাইল্ড শেলের মধ্যে কার্যকর করা হয়, শেলটি একটি কোড সহ প্রস্থান করে 255:

$ exit 3.14159
exit
bash: exit: 3.14159: numeric argument required

আরও মজাদার জন্য, আমি একটি সাধারণ সি প্রোগ্রাম চালানোর চেষ্টাও করেছি তবে এই ক্ষেত্রে মনে হচ্ছে যে exit(3)ফাংশনটি প্রস্থান করার আগে ভাসাটি কেবল একটি ইনটে (এই ক্ষেত্রে 3) রূপান্তরিত করে:

#include <stdlib.h>
main()
{
    exit(3.14159);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.