আদেশগুলি বিবেচনা করুন
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=false
OpenBSD শাঁস (এটা বিনষ্ট হবে) ব্যবহার করে, এবং আমি নিশ্চিত করুন যে এটি নকশা ছিল, ভুল করে বা ভুল বোঝাবুঝি, নাকি অন্য কিছু দ্বারা ছিল না।
eval false
স্ক্রিপ্টটি শেষ করার প্রত্যাশা করবেন এমনকি এটি কোনও AND-OR তালিকার অংশ বা শর্তসাপেক্ষ বিবৃতি নয়? আমি না।
set -e
সেট করা থাকে তবে আমি নিশ্চিত নই ... আমি সম্মত হই যে শর্তাধীন বিবৃতিতে শেষ না করাই বুদ্ধিমান।
set -e
so () `এর উত্তর হয়।
eval false
একটি শূন্য-স্থিতি জেনারেট করে তাই আমিset -e
স্ক্রিপ্টটি সেই মুহুর্তে শেষ করার আশা করব । ক্ষেত্রে বিবৃতি!
set -e
প্রযোজ্য না হিসাবে!
স্পষ্টভাবে প্রস্থান স্থিতি পরীক্ষা করে।