set -e
কোনও শর্ত ছাড়াই যদি কোনও ননজারো প্রস্থান কোডের মুখোমুখি হয় তবে স্ক্রিপ্টটি সমাপ্ত করে। কয়েকটি শব্দে এর ব্যবহারের বিপদগুলি সংক্ষিপ্ত করতে: এটি কীভাবে লোকেরা মনে করে এটি আচরণ করে না।
আমার মতে, এটিকে একটি বিপজ্জনক হ্যাক হিসাবে বিবেচনা করা উচিত যা কেবলমাত্র সামঞ্জস্যের উদ্দেশ্যেই অব্যাহত রয়েছে। set -e
বিবৃতি ব্যতিক্রম মত নিয়ন্ত্রণ প্রবাহ ব্যবহার করে একটি ভাষায় ত্রুটি কোডের ব্যবহার করে এমন ভাষা থেকে শেল চালু না, এটি নিছক দুর্বল যে আচরণ অনুকরণ করতে চেষ্টা করে।
এর ঝুঁকি সম্পর্কে গ্রেগ উওলানার অনেক কথা রয়েছে set -e
:
দ্বিতীয় লিঙ্কে, এর অপ্রচলিত এবং অপ্রত্যাশিত আচরণের বিভিন্ন উদাহরণ রয়েছে set -e
।
এর অনিচ্ছাকৃত আচরণের কয়েকটি উদাহরণ set -e
(কিছু উপরে উইকি লিঙ্ক থেকে নেওয়া):
সেট -ই
এক্স = 0
এক্স ++ দিন
প্রতিধ্বনি "x হল $ x"
উপরের ফলে শেল স্ক্রিপ্ট অকালমূখ প্রস্থান করবে, কারণ let x++
0 প্রদান করে, যা মূল let
শব্দ দ্বারা মিথ্যা মান হিসাবে বিবেচিত হয় এবং ননজারো প্রস্থান কোডে পরিণত হয়। set -e
এটি লক্ষ্য করে এবং নিঃশব্দে স্ক্রিপ্টটি সমাপ্ত করে।
সেট -ই
[-d / opt / foo] && প্রতিধ্বনি "সতর্কতা: foo ইতিমধ্যে ইনস্টল করা আছে overw ওভাররাইট হবে।" > & 2
প্রতিস্থাপন "ফু ইনস্টল করা হচ্ছে ..."
উপরেরটি প্রত্যাশা মতো কাজ করে, /opt/foo
ইতিমধ্যে উপস্থিত থাকলে একটি সতর্কতা মুদ্রণ করে ।
সেট -ই
চেক_প্রিয়ার_ইনস্টল () {
[-d / opt / foo] && প্রতিধ্বনি "সতর্কতা: foo ইতিমধ্যে ইনস্টল করা আছে overw ওভাররাইট হবে।" > & 2
}
check_previous_install
প্রতিস্থাপন "ফু ইনস্টল করা হচ্ছে ..."
উপরোক্ত, একমাত্র পার্থক্য থাকা সত্ত্বেও যে কোনও একক লাইন একটি ফাংশনে রিফ্যাক্টর হয়েছে, /opt/foo
বিদ্যমান না থাকলে তা সমাপ্ত হবে । এটি কারণ যে এটি মূলত কাজ করেছিল তা set -e
আচরণের একটি বিশেষ ব্যতিক্রম । a && b
ননজারো যখন ফেরত দেয়, তখন এটি এড়ানো হবে set -e
। যাইহোক, এখন এটি একটি ফাংশন, ফাংশনটির প্রস্থান কোড the কমান্ডের প্রস্থান কোডের সমান, এবং নানজারো ফাংশনটি ফিরছে নীরবে স্ক্রিপ্টটি সমাপ্ত করবে।
সেট -ই
আইএফএস = $ '\ n' রিড-ডি '' -r -a কনফিগারেশন_ভার্স <কনফিগারেশন
উপরের config_vars
ফাইলটি থেকে অ্যারেটি পড়বে config
। যেমনটি লেখকের উদ্দেশ্য হতে পারে, config
অনুপস্থিত থাকলে এটি একটি ত্রুটি দিয়ে শেষ করে । যেহেতু লেখকের উদ্দেশ্য নেই, এটি config
কোনও নতুন লাইনে শেষ না হলে নীরবে এটি শেষ করে। যদি set -e
এখানে ব্যবহার না করা হয় config_vars
তবে ফাইলের সমস্ত লাইন এতে একটি নতুন লাইনে শেষ হয়েছে কিনা তা অন্তর্ভুক্ত থাকবে।
সাব্লাইম টেক্সটের ব্যবহারকারী (এবং অন্যান্য পাঠ্য সম্পাদক যারা নিউলাইনগুলি ভুলভাবে পরিচালনা করে), সাবধান হন।
সেট -ই
should_audit_user () {
স্থানীয় গোষ্ঠী গোষ্ঠী = "$ (গোষ্ঠী" $ 1 ")"
$ দলে গ্রুপের জন্য; করা
যদি ["$ গ্রুপ" = নিরীক্ষণ]; তারপরে 0 ফিরে আসুন; ফাই
সম্পন্ন
প্রত্যাবর্তন 1
}
যদি should_audit_user "$ ব্যবহারকারী"; তারপর
লগার 'ব্লাহ'
ফাই
লেখক এখানে যুক্তিযুক্তভাবে আশা করতে পারেন যে কোনও কারণে যদি ব্যবহারকারী $user
উপস্থিত না থাকে তবে groups
কমান্ডটি ব্যর্থ হবে এবং ব্যবহারকারীর কিছু কাজ বিনা বিচারে সম্পাদন করার পরিবর্তে স্ক্রিপ্টটি বন্ধ হয়ে যাবে। যাইহোক, এক্ষেত্রে set -e
অবসান কার্যকর হয় না। যদি $user
কোনও কারণে খুঁজে পাওয়া না যায়, স্ক্রিপ্টটি বন্ধ করার পরিবর্তে, should_audit_user
ফাংশনটি কেবলমাত্র set -e
কার্যকর ডেটার মতো কার্যকর তথ্য ফিরিয়ে দেবে ।
এটি if
বিবৃতিটির শর্তের অংশ থেকে আহ্বান করা কোনও ক্রিয়াকলাপের ক্ষেত্রে প্রযোজ্য , যতই গভীরভাবে বাসা বেঁধে দেওয়া হোক না কেন, যেখানেই এটি সংজ্ঞায়িত করা হোক না কেন, আপনি set -e
এটির ভিতরে আবারও দৌড়ান কিনা । শর্ত ব্লক সম্পূর্ণরূপে সম্পাদিত না হওয়া পর্যন্ত যে if
কোনও পয়েন্টে ব্যবহার সম্পূর্ণরূপে এর প্রভাবকে অক্ষম করে set -e
। লেখক যদি এই ক্ষতির বিষয়ে অবগত না হন বা কোনও সম্ভাব্য পরিস্থিতিতে যেখানে ফাংশন বলা যেতে পারে তাদের পুরো কল স্ট্যাকটি জানেন না, তবে তারা বাগি কোড লিখবেন এবং প্রদত্ত সুরক্ষার ভ্রান্ত ধারণাটি set -e
কমপক্ষে আংশিকভাবে হবে দোষারোপ।
এমনকি লেখক যদি এই ক্ষতির বিষয়ে পুরোপুরি অবগত হন, তবুও কার্যবিবরণী কোডটি একইভাবে লিখতে হয় যেহেতু কেউ এটি ছাড়াই লিখতে পারে set -e
, কার্যকরভাবে সেই সুইচটিকে অকেজোের চেয়ে কম উপস্থাপন করে; কেবল লেখককে ম্যানুয়াল ত্রুটি পরিচালনা করার কোডটি লিখতে হবে যেমন set -e
কার্যকর ছিল না, তবে উপস্থিতি set -e
তাদের ভেবে ভ্রষ্ট করেছে যে তাদের তা করতে হবে না।
এর আরও কিছু ত্রুটি set -e
:
- এটি স্লোপি কোডকে উত্সাহ দেয়। ত্রুটি পরিচালনাকারীরা সম্পূর্ণরূপে ভুলে যায়, এই আশায় যে যা কিছু ব্যর্থ হয়েছে ত্রুটিটি কিছু বুদ্ধিমান উপায়ে রিপোর্ট করবে। যাইহোক,
let x++
উপরের মতো উদাহরণ সহ , এটি ক্ষেত্রে নয়। যদি স্ক্রিপ্টটি অপ্রত্যাশিতভাবে মারা যায়, তবে এটি সাধারণত নীরবে থাকে, যা ডিবাগ করতে বাধা দেয়। যদি স্ক্রিপ্টটি মারা না যায় এবং আপনি এটি (পূর্ববর্তী বুলেট পয়েন্টটি দেখুন) প্রত্যাশা করেছিলেন, তবে আপনার হাতে আরও সূক্ষ্ম এবং कपে বাগ রয়েছে।
- এটি মানুষকে সুরক্ষার একটি মিথ্যা অনুভূতির দিকে নিয়ে যায়। আবার
if
শর্তে -শক্তি বুলেট পয়েন্টটি দেখুন।
- যে জায়গাগুলিতে শেলটি শেষ হয় সেগুলি শেল বা শেল সংস্করণের মধ্যে সামঞ্জস্যপূর্ণ নয়। দুর্ভাগ্যক্রমে কোনও স্ক্রিপ্ট লেখা সম্ভব যা বাশনের পুরানো সংস্করণে ভিন্ন রূপে আচরণ করে
set -e
those সংস্করণগুলির মধ্যে টুইট করা হয়েছে।
set -e
এটি একটি বিতর্কিত সমস্যা এবং এর আশেপাশের সমস্যাগুলি সম্পর্কে সচেতন কিছু লোকেরা এর বিরুদ্ধে সুপারিশ করেন, আবার কিছু লোক সমস্যাগুলি জানার জন্য সক্রিয় থাকাকালীন কেবল যত্ন নেওয়ার পরামর্শ দেন। অনেকগুলি শেল স্ক্রিপ্টিং newbies রয়েছে যারা set -e
ত্রুটির অবস্থার জন্য সমস্ত স্ক্রিপ্টগুলিকে ক্যাচ-অল হিসাবে সুপারিশ করে তবে বাস্তব জীবনে এটি সেভাবে কাজ করে না।
set -e
শিক্ষার বিকল্প নেই।