পরিষ্কার প্রস্থানের জন্য অ-শূন্য প্রস্থান স্থিতি


15

যদি প্রশ্নে কর্মসূচিটি সঠিকভাবে চালিত হয় তবে কোনও শূন্য-বহির্গমন প্রস্থান কোডটি ফেরানো কি গ্রহণযোগ্য? উদাহরণস্বরূপ, বলুন আমার কাছে একটি সাধারণ প্রোগ্রাম রয়েছে যা (কেবল) নিম্নলিখিতগুলি করে:

প্রোগ্রাম এন আর্গুমেন্ট লাগে। এটি মিনিটের একটি প্রস্থান কোড ফেরত দেয় (এন, 255)। নোট করুন যে কোনও এন প্রোগ্রামের জন্য বৈধ।

আরও বাস্তবসম্মত প্রোগ্রামটি সাফল্যের সাথে চালিত প্রোগ্রামগুলির জন্য বিভিন্ন কোড ফেরত দিতে পারে যা বিভিন্ন জিনিসকে নির্দেশ করে। এই প্রোগ্রামগুলির পরিবর্তে স্টাডাউটের মতো কোনও স্ট্রিমে এই তথ্যটি লেখা উচিত?

উত্তর:


24

এটি পরিবেশের উপর নির্ভর করে, তবে আমি বলব এটি খারাপ স্টাইল।

ইউনিক্সের মতো সিস্টেমে একটি শক্তিশালী কনভেনশন থাকে যে 0 এর একটি প্রস্থান স্থিতি সাফল্যকে নির্দেশ করে এবং কোনও শূন্য-বহির্গমন স্থিতি ব্যর্থতা নির্দেশ করে। কিছু, তবে সমস্ত নয়, প্রোগ্রামগুলি বিভিন্ন শূন্য-বহির্গমন প্রস্থান কোডগুলির সাথে বিভিন্ন ধরণের ব্যর্থতার মধ্যে পার্থক্য করে; উদাহরণস্বরূপ grepসাধারণত প্যাটার্নটি পাওয়া গেলে 0, এবং এটির অনুপস্থিত ফাইলের মতো ত্রুটি থাকলে 2 (বা আরও বেশি) পাওয়া যায়।

এই কনভেনশনটি ইউনিক্স শেলগুলিতে বেশ শক্ত হয়ে গেছে। উদাহরণস্বরূপ, মধ্যে sh, bashএবং অন্যান্য বোর্ন মত শেল, ifবিবৃতি একইরূপে সাফল্য / সত্য হিসাবে একটি 0 প্রস্থান স্থিতি এবং ব্যর্থতা / মিথ্যা হিসাবে একটি নন-জিরো প্রস্থান স্থিতি:

if your-command
then
    echo ok
else
    echo FAILURE
fi

আমি বিশ্বাস করি এমএস উইন্ডোজের অধীনে এই সম্মেলনগুলি একই রকম।

এখন অবশ্যই আপনার নিজের প্রোগ্রাম লিখতে বাধা দেওয়ার কিছু নেই যা প্রচলিত প্রস্থান কোডগুলি ব্যবহার করে, বিশেষত যদি এর সাথে আর কিছু না হয় তবে সচেতন হন যে আপনি একটি সুপ্রতিষ্ঠিত কনভেনশন লঙ্ঘন করছেন, এবং এটি পরে এসে আপনাকে কামড়াতে পারে

কোনও প্রোগ্রামের এই ধরণের তথ্য ফেরত দেওয়ার স্বাভাবিক উপায় হ'ল এটি মুদ্রণ করা stdout:

status = $(your-command)
echo Result is $status

7
কনভেনশনটি ব্যাখ্যা করার জন্য +1, এই পদ্ধতির ফলে আমার বেশিরভাগ শেল স্ক্রিপ্টগুলি ভেঙে যায় যদি আমি set -eকোথাও রাখি put
বেনিয়ামিন বান্নিয়ার

একইভাবে grep, diffপার্থক্য পাওয়া গেলে 1 প্রদান করে; এবং> 1 যদি ত্রুটি ঘটে থাকে।
7heo.tk

6

আপনার পরিবেশ কী প্রত্যাশা করে তার উপর নির্ভর করে।

উইরেডনেসের জন্য আমার প্রিয়, উইকিপিডিয়া থেকে :

ওপেনভিএমএসে, সাফল্য বিজোড় মানগুলি এবং এমনকি মান দ্বারা ব্যর্থতা দ্বারা চিহ্নিত করা হয়। মানটি সাব-ফিল্ডগুলির সাথে একটি 32 বিট পূর্ণসংখ্যা: কন্ট্রোল বিট, সুবিধা নম্বর, বার্তা সংখ্যা এবং তীব্রতা। তীব্র মানগুলি সাফল্য (সাফল্য, তথ্যমূলক) এবং ব্যর্থতার (সতর্কতা, ত্রুটি, মারাত্মক) মধ্যে ভাগ করা হয়।


4

আমি মনে করি যদি প্রস্থান কোডটি অর্থবহ, কলারের কাছে প্রাসঙ্গিক তথ্য এবং সাফল্যের সংজ্ঞাটি সত্যিই দ্বিপদী না হয় তবে এর নজির রয়েছে। যে নজিরটির কথা আমি ভাবছি তা হ'ল রোবকপি যা ঘটেছিল তার উপর নির্ভর করে বিভিন্ন বিষয়কে অনেক কিছু দেয়

আমি যুক্ত করব যে এর কারণে আমরা সর্বদা কিছু ডিবাগিং শেষ করি - বেশিরভাগ ইউটিলিটি প্রস্থান কোড 0 == সাফল্য ধরে রাখে তাই রোবকপিটি 1 ফেরত পেলে ফাঁকা হয়ে যায় কারণ এটি স্টাফ অনুলিপি করে না কারণ এটি স্টাফ অনুলিপি করে না তবে ' টি একটি ত্রুটি পেতে।


2

সফল রানের জন্য 0 না ফিরিয়ে দেওয়া একটি খারাপ ধারণা, কারণ এটি আপনার প্রোগ্রামটি চালানোর ক্ষেত্রে বিভ্রান্তি সৃষ্টি করতে পারে। যদি কেউ আপনার প্রোগ্রামটি বিভিন্ন ইনপুট দিয়ে 100+ বার চালিয়ে যায় এবং কতগুলি ব্যর্থ বা সফলভাবে সম্পন্ন হয়েছে তা জানতে চেয়েছিল, একক সাফল্যের মান হ'ল এটি বিভিন্ন ভিন্ন মান থাকার চেয়ে পার্থক্যগুলিকে চিহ্নিত করা আরও সহজ করে তোলে।

আপনার যদি এমন কোনও প্রোগ্রাম রয়েছে যাতে একাধিক সফল প্রত্যাবর্তনের পথ রয়েছে যা সকলেই বিভিন্ন জিনিসকে বোঝাতে পারে তবে আমি বলতে পারি যে এটি আপনার প্রোগ্রামটি খারাপভাবে ডিজাইন করা হয়েছে sign


2

আমি এমন একটি ক্ষেত্রে জানি যা আমি গ্রহণযোগ্য বলে মনে করি। আমি একটি পরীক্ষামূলক কাঠামো জানি যা পরীক্ষার ব্যর্থতার মোট সংখ্যার সাথে প্রস্থান করে। সুতরাং, উদাহরণস্বরূপ, যদি পরীক্ষা রানার কোনও ব্যর্থ পরীক্ষা দিয়ে সম্পূর্ণ করে তবে এটি শূন্যের সাথে প্রস্থান করে। যদি একটি পরীক্ষা ব্যর্থ হয়, যদিও পরীক্ষা রানার নিজেই প্রোপাই দৌড়েছিল, তবে এটি একটির সাথেই প্রস্থান করে two যদি দুটি ব্যর্থ হয় তবে এটি ২, ইত্যাদি ফেরত দেয় This এটি 250 বা তার বেশি পরীক্ষা ব্যর্থতা হিসাবে চলে যায়।

এটি অস্বাভাবিক প্রস্থানগুলি বোঝাতে প্রস্থান কোডগুলি> 250 ব্যবহার করে।

যদিও এটি কনভেনশন লঙ্ঘন করে, এটি অনুশীলনে ভালভাবে কাজ করে।


3
আমি এই মনে করি না করে কনভেনশন লঙ্ঘন - পরীক্ষামূলক সফল হয় যদি কোন ত্রুটি আছে; কোনও শূন্য-ফলাফল ফলাফল কোড ব্যর্থ পরীক্ষার নির্দেশ করে।
বেভান

1
এটি "0 টিরও বেশি ত্রুটি চিহ্নিত করার জন্য একটি ত্রুটির স্থিতি সহ প্রস্থান করা" এবং এটি প্রস্থান স্থিতির সঠিক সাধারণ শব্দার্থ লঙ্ঘন করতে পারে তবে এটি অবশ্যই বৃহত্তর লঙ্ঘন করে না "0 ঠিক আছে, 0 এর চেয়ে বড় কিছু একটি ত্রুটি" কনভেনশন ।
ভ্যাটাইন

2

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

সুতরাং, যদি বিভিন্ন সাফল্যের রাজ্যগুলি থাকে, তবে এটির বিবিধ রিটার্ন মান ব্যবহার করা উপযুক্ত।


2

একটি ভাল উদাহরণ: ম্যান সা-আপডেট (স্প্যামাস্যাসিন)

কোড থেকে প্রস্থান করুন

  • 0 এর একটি প্রস্থান কোড মানে একটি আপডেট পাওয়া যায় এবং --চেকনি নির্দিষ্ট না করা থাকলে ডাউনলোড এবং সফলভাবে ইনস্টল করা হয়েছিল।
  • 1 এর একটি প্রস্থান কোড এর অর্থ কোনও নতুন আপডেট উপলব্ধ ছিল না।
  • 2 এর একটি প্রস্থান কোড মানে ...

এই ক্ষেত্রে, প্রস্থান 1 হ'ল একটি তথ্যমূলক কোড। যাইহোক, আমি কোডটি লিখতে থাকলে, আমি সাধারণত 1 ব্যর্থ না কারণ এটি সাধারণত ব্যর্থ হয়।

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