আদেশগুলি বিবেচনা করুন
eval false || echo ok
echo also ok
সাধারণত, আমরা এটি falseইউটিলিটি কার্যকর করতে এবং আশা করি , যেহেতু প্রস্থান স্থিতি শূন্য নয়, তারপরে কার্যকর করা হবে echo okএবং echo also ok।
সব মিলিয়ে POSIX মত শাঁস আমি ব্যবহার ( ksh93, zsh, bash, dash, OpenBSD ksh, এবং yash) এই কি হয়, কিন্তু কিছু আকর্ষণীয় যদি আমরা সক্ষম পেতে set -e।
যদি set -eকার্যকর হয়, ওপেনবিএসডি shএবং kshশেলগুলি (উভয় থেকে প্রাপ্ত pdksh) স্ক্রিপ্টটি সমাপ্ত করবে যখন ড eval। অন্য কোনও শেল তা করে না।
পসিএক্স বলেছে যে একটি বিশেষ অন্তর্নির্মিত ইউটিলিটিতে (যেমন eval) ত্রুটির ফলে অ-ইন্টারেক্টিভ শেলটি বন্ধ হতে হবে। আমি নির্ধারিতভাবে false"একটি ত্রুটি" গঠন করে কিনা তা সম্পূর্ণরূপে নিশ্চিত নই (এটি যদি ছিল তবে এটি set -eসক্রিয় হওয়ার থেকে স্বাধীন হবে )।
এটিকে ঘিরে কাজ করার উপায়টি মনে হয় এটি evalএকটি সাব শেলটিতে রাখা হবে,
( eval false ) || echo ok
echo also ok
প্রশ্নটি কি আমি পসিক্স-লির সঠিক শেল স্ক্রিপ্টে করার তা প্রত্যাশা করি বা এটি ওপেনবিএসডি-এর শেলের মধ্যে কোনও বাগ রয়েছে কিনা? এছাড়াও, উপরের সাথে যুক্ত পসিক্স পাঠ্যে "ত্রুটি" বলতে কী বোঝায়?
অতিরিক্ত বিট তথ্য: ওপেনবিএসডি শেলগুলি কমান্ডের echo okসাথে এবং ছাড়া উভয়কেই কার্যকর করবেset -e
eval ! true || echo ok
আমার আসল কোডটি দেখে মনে হচ্ছে
set -e
if eval "$string"; then
echo ok
else
echo not ok
fi
যা would না আউটপুট not okসঙ্গে string=falseOpenBSD শাঁস (এটা বিনষ্ট হবে) ব্যবহার করে, এবং আমি নিশ্চিত করুন যে এটি নকশা ছিল, ভুল করে বা ভুল বোঝাবুঝি, নাকি অন্য কিছু দ্বারা ছিল না।
eval falseস্ক্রিপ্টটি শেষ করার প্রত্যাশা করবেন এমনকি এটি কোনও AND-OR তালিকার অংশ বা শর্তসাপেক্ষ বিবৃতি নয়? আমি না।
set -eসেট করা থাকে তবে আমি নিশ্চিত নই ... আমি সম্মত হই যে শর্তাধীন বিবৃতিতে শেষ না করাই বুদ্ধিমান।
set -eso () `এর উত্তর হয়।
eval falseএকটি শূন্য-স্থিতি জেনারেট করে তাই আমিset -eস্ক্রিপ্টটি সেই মুহুর্তে শেষ করার আশা করব । ক্ষেত্রে বিবৃতি!set -eপ্রযোজ্য না হিসাবে!স্পষ্টভাবে প্রস্থান স্থিতি পরীক্ষা করে।