একক ইউনিক্স স্পেসিফিকেশনে এর অর্থটিset -e
বর্ণনা করতে সঠিক ভাষাটি ব্যবহৃত হয়:
যখন এই বিকল্পটি চালু থাকে, শেল ত্রুটিগুলির ফলাফলের তালিকাভুক্ত কোনও কারণে যদি একটি সাধারণ কমান্ড ব্যর্থ হয় বা একটি প্রস্থান স্থিতির মান> 0 প্রদান করে এবং [শর্তসাপেক্ষ বা অবহেলিত কমান্ড] না হয়, তবে শেলটি তত্ক্ষণাত প্রস্থান করা হবে।
এই ধরনের একটি কমান্ড সাব-শেলের মধ্যে আসলে কী হয় তা নিয়ে একটি অস্পষ্টতা রয়েছে । ব্যবহারিক দৃষ্টিকোণ থেকে, সমস্ত সাবস্কেল যা করতে পারে তা প্রস্থান এবং পিতামাতার শেলের কাছে একটি ননজারো স্থিতি ফিরিয়ে আনতে হবে। প্যারেন্ট শেলটি পরিবর্তিতভাবে প্রস্থান করবে কিনা তার উপর নির্ভর করে এই ননজারো স্থিতিটি পিতামাত্ত শেলটিতে ব্যর্থ হওয়া কোনও সাধারণ কমান্ডে অনুবাদ করে কিনা on
এরকম একটি সমস্যাযুক্ত কেস হ'ল আপনার মুখোমুখি হওয়া: একটি কমান্ড সাবস্টিটিউশন থেকে ননজারো রিটার্নের স্থিতি । যেহেতু এই স্থিতিটিকে উপেক্ষা করা হচ্ছে, এটি প্যারেন্ট শেলটিকে প্রস্থান করতে পারে না। হিসাবে আপনি ইতিমধ্যে আবিষ্কার করেছি একাউন্টে প্রস্থান অবস্থা গ্রহণ করা একটি উপায় একটি সহজ কমান্ড প্রতিকল্পন ব্যবহার করা নিয়োগ তারপর: নিয়োগ প্রস্থান অবস্থা নিয়োগ (গুলি) গত কমান্ড প্রতিকল্পন প্রদর্শন করে প্রস্থান অবস্থা ।
মনে রাখবেন যে কেবলমাত্র সর্বশেষ প্রতিস্থাপনের স্থিতি বিবেচনায় নেওয়া হলে কেবলমাত্র একটি একক কমান্ড প্রতিস্থাপন থাকলেই এটি উদ্দেশ্য হিসাবে সম্পাদন করবে। উদাহরণস্বরূপ, নীচের কমান্ডটি সফল (উভয়ই মান অনুযায়ী এবং প্রতিটি বাস্তবায়নে আমি দেখেছি):
a=$(false)$(echo foo)
জন্য ঘড়ি আরেকটি ক্ষেত্রে দেখা যায় স্পষ্ট subshells : (somecommand)
। উপরোক্ত ব্যাখ্যা অনুসারে, সাবশেল একটি ননজারো স্থিতি ফিরিয়ে দিতে পারে, তবে যেহেতু এটি প্যারেন্ট শেলের কোনও সাধারণ কমান্ড নয়, প্যারেন্ট শেলটি চালিয়ে যাওয়া উচিত। আসলে, আমার জানা সমস্ত শেলগুলি পিতামাতাকে এই সময়ে ফিরে আসে। যদিও এটি অনেক ক্ষেত্রে যেমন (cd /some/dir && somecommand)
প্যারেন্টেসিসগুলি কোনও ক্রিয়াকলাপ যেমন কোনও বর্তমান ডিরেক্টরি পরিবর্তন হিসাবে স্থানীয় রাখতে ব্যবহৃত হয় set -e
ততক্ষণে এটি সাবস্কেলে বন্ধ করা থাকলে স্পেসিফিকেশনটিকে লঙ্ঘন করে বা সাবসেল কোনও ননজারো স্ট্যাটাসটি এমনভাবে ফেরত দেয় যাতে !
সত্যিকারের কমান্ড ব্যবহার করার মতো এটি এটিকে বন্ধ করবে না । উদাহরণস্বরূপ, foo
নিম্নলিখিত উদাহরণগুলি প্রদর্শন না করে ছাই, বাশ, পিডিএক্স, ksh93 এবং zsh এর সমস্ত প্রস্থান :
set -e; (set +e; false); echo "This should be displayed"
set -e; (! true); echo "This should be displayed"
তবুও set -e
কার্যকর হওয়ার সময় কোনও সাধারণ আদেশ ব্যর্থ হয়নি !
তৃতীয় সমস্যাযুক্ত কেস হ'ল একটি অনিয়ন্ত্রিত পাইপলাইনের উপাদান । অনুশীলনে, সমস্ত শেলগুলি শেষের ব্যতীত পাইপলাইনের উপাদানগুলির ব্যর্থতা উপেক্ষা করে এবং সর্বশেষ পাইপলাইন উপাদান সম্পর্কিত দুটি আচরণের একটি প্রদর্শন করে:
- এটিটি ksh এবং zsh, যা প্যারেন্ট শেলের পাইপলাইনের শেষ উপাদানটি কার্যকর করে, যথারীতি ব্যবসা করে: পাইপলাইনের শেষ উপাদানটিতে যদি একটি সাধারণ কমান্ড ব্যর্থ হয় তবে শেলটি সেই আদেশটি কার্যকর করে, যা প্যারেন্ট শেল হিসাবে দেখা যায়, প্রস্থান করে।
- অন্যান্য শাঁসগুলি যদি পাইপলাইনের শেষ উপাদানটি ননজারো স্থিতি ফিরিয়ে দেয় তবে প্রস্থান করে আচরণের আনুমানিক।
আগের মত, set -e
পাইপলাইনের শেষ উপাদানটিতে অবহেলা বা অবহেলা ব্যবহারের ফলে এটি শাঁসটি শেষ না করে এমনভাবে একটি ননজারো স্থিতি ফিরিয়ে আনবে; এটিটি ksh এবং zsh ছাড়া অন্য শেলগুলি তখন প্রস্থান করবে।
বাশ-এর pipefail
বিকল্পের ফলে কোনও পাইপলাইন অবিলম্বে প্রস্থান করতে পারে set -e
যদি এর কোনও উপাদান ননজারো স্থিতি ফিরিয়ে দেয়।
মনে রাখবেন যে আরও জটিলতা হিসাবে, set -e
পশম মোডে না থাকলে ( set -o posix
বা POSIXLY_CORRECT
বাশ শুরু হওয়ার সাথে সাথে পরিবেশে থাকতে পারে ) ব্যাশ সাবশেলগুলিতে বন্ধ হয় ।
এই সবগুলি দেখায় যে পসিএক্স স্পেসিফিকেশন দুর্ভাগ্যক্রমে -e
বিকল্পটি নির্দিষ্ট করার ক্ষেত্রে একটি দুর্বল কাজ করে । ভাগ্যক্রমে, বিদ্যমান শেলগুলি তাদের আচরণে বেশিরভাগ ক্ষেত্রেই সামঞ্জস্যপূর্ণ।