এটি একটি পুরানো প্রশ্ন, তবে এখানে কোনও উত্তরই দেবিয়ান প্যাকেজ হ্যান্ডলিং স্ক্রিপ্টগুলিতে set -e
ওরফে ব্যবহারের বিষয়ে আলোচনা করে set -o errexit
না। দেবিয়ান নীতি অনুসারে এই স্ক্রিপ্টগুলিতে এই বিকল্পটির ব্যবহার বাধ্যতামূলক ; অভিপ্রায়টি স্পষ্টতই একটি নিয়ন্ত্রণহীন ত্রুটির অবস্থার কোনও সম্ভাবনা এড়াতে।
বাস্তবে এর অর্থ হ'ল আপনার বোঝা উচিত যে আপনি যে কমান্ডগুলি চালাচ্ছেন সেগুলি কোনও শর্তে কোনও ত্রুটি ফিরিয়ে দিতে পারে এবং এই ত্রুটিগুলির প্রতিটি স্পষ্টভাবে পরিচালনা করতে পারে।
সাধারণ গ্যাটাচগুলি diff
হ'ল grep
( পার্থক্য থাকলে ত্রুটি ফেরায় ) এবং (কোনও মিল না থাকলে ত্রুটি প্রদান করে)। আপনি সুস্পষ্ট হ্যান্ডলিংয়ের মাধ্যমে ত্রুটিগুলি এড়াতে পারবেন:
diff this that ||
echo "$0: there was a difference" >&2
grep cat food ||
echo "$0: no cat in the food" >&2
(আমরা কীভাবে বর্তমান স্ক্রিপ্টের নাম বার্তায় অন্তর্ভুক্ত করতে এবং স্ট্যান্ডার্ড আউটপুটের পরিবর্তে ডায়াগনস্টিক বার্তাগুলি স্ট্যান্ডার্ড ত্রুটিতে লেখার জন্য যত্ন নিই তা লক্ষ্য করুন))
যদি কোনও স্পষ্ট হ্যান্ডলিং সত্যিই প্রয়োজনীয় বা দরকারী না হয় তবে স্পষ্টভাবে কিছুই করবেন না:
diff this that || true
grep cat food || :
(শেলের :
নো-অপ্ট কমান্ডের ব্যবহারটি কিছুটা অস্পষ্ট, তবে সাধারণভাবে দেখা যায়))
শুধু পুনরাবৃত্তি করতে,
something || other
সংক্ষিপ্ত
if something; then
: nothing
else
other
fi
অর্থাৎ আমরা স্পষ্টভাবে বলি other
যদি something
ব্যর্থ হয় তবে চালানো উচিত । Longhand করতে if
(এবং মত অন্যান্য শেল প্রবাহ নিয়ন্ত্রণ বিবৃতি while
, until
) ও একটি ত্রুটি হ্যান্ডেল করতে একটি বৈধ উপায় (প্রকৃতপক্ষে, যদি না থাকতো, শেল স্ক্রিপ্টের set -e
প্রবাহ নিয়ন্ত্রণ বিবৃতি ধারণ না পারে!)
এবং এগুলি হ্যান্ডলারের অনুপস্থিতিতে কেবল স্পষ্ট করে বলা, set -e
পুরো স্ক্রিপ্টটি তাত্ক্ষণিকভাবে একটি ত্রুটির সাথে ব্যর্থ হয়ে যদি কোনও তাত্পর্য diff
পাওয়া যায়, বা grep
কোনও মিল খুঁজে না পায়।
অন্যদিকে, কিছু কমান্ডগুলি যখন আপনি চান তখন ত্রুটি থেকে বেরিয়ে যাওয়ার স্থিতি তৈরি করে না। সাধারণত সমস্যাযুক্ত কমান্ডগুলি হ'ল find
(প্রস্থান স্থিতি ফাইলগুলি আসলে পাওয়া গিয়েছিল কিনা তা প্রতিফলিত করে না) এবং sed
(প্রস্থান স্থিতিটি প্রকাশ করে না যে স্ক্রিপ্টটি কোনও ইনপুট পেয়েছে বা আসলে কোনও কমান্ড সফলভাবে সম্পাদন করেছে কিনা)। কিছু পরিস্থিতিতে একটি সাধারণ গার্ড হ'ল একটি কমান্ডের পাইপ করা যা কোনও আউটপুট না থাকলে চিৎকার করে:
find things | grep .
sed -e 's/o/me/' stuff | grep ^
এটি লক্ষ করা উচিত যে পাইপলাইনের প্রস্থান স্থিতি হ'ল সেই পাইপলাইনে শেষ কমান্ডের প্রস্থান স্থিতি। সুতরাং উপরে কমান্ড আসলে সম্পূর্ণরূপে অবস্থা মাস্ক find
এবং sed
, এবং শুধুমাত্র আপনি বলতে কিনা grep
পরিশেষে সফল হয়েছে।
(বাশের কাছে অবশ্যই রয়েছে set -o pipefail
; তবে দেবিয়ান প্যাকেজ স্ক্রিপ্টগুলি ব্যাশ বৈশিষ্ট্যগুলি ব্যবহার করতে পারে না The নীতিটি sh
এই স্ক্রিপ্টগুলির জন্য পসিক্সের ব্যবহার দৃ firm়ভাবে আদেশ করে , যদিও এটি সর্বদা ঘটনা ছিল না))
অনেক পরিস্থিতিতে, ডিফেন্সিয়ালি কোডিং করার সময় এটি আলাদাভাবে নজর রাখা উচিত। কখনও কখনও আপনাকে উদাহরণস্বরূপ একটি অস্থায়ী ফাইলের মধ্যে দিয়ে যেতে হয় যাতে আপনি দেখতে পান যে আউটপুটটি উত্পাদিত কমান্ডটি সফলভাবে শেষ হয়েছে কিনা, এমনকি আইডিয়োম এবং সুবিধাটি অন্যথায় আপনাকে শেল পাইপলাইন ব্যবহারের জন্য নির্দেশনা দেয়।