শর্তাধীন অভিব্যক্তিতে "সেট-ই" এর অধীনে "ইভাল" এর আচরণ


10

আদেশগুলি বিবেচনা করুন

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একটি শূন্য-স্থিতি জেনারেট করে তাই আমি set -eস্ক্রিপ্টটি সেই মুহুর্তে শেষ করার আশা করব । ক্ষেত্রে বিবৃতি ! set -eপ্রযোজ্য না হিসাবে !স্পষ্টভাবে প্রস্থান স্থিতি পরীক্ষা করে।
fcbsd

@fcbsd আপনি কি eval falseস্ক্রিপ্টটি শেষ করার প্রত্যাশা করবেন এমনকি এটি কোনও AND-OR তালিকার অংশ বা শর্তসাপেক্ষ বিবৃতি নয়? আমি না।
কুসালানন্দ

আমি সঠিক নই যদি set -eসেট করা থাকে তবে আমি নিশ্চিত নই ... আমি সম্মত হই যে শর্তাধীন বিবৃতিতে শেষ না করাই বুদ্ধিমান।
এফসিবিএসডি

CentOS 7 এ sh নিয়ে আরও কিছু খেলে - আমি বলব যে ওপেনবিএসডি এর ksh / sh এর জন্য ব্যবহার করা যখন set -eso () `এর উত্তর হয়।
fcbsd

উত্তর:


4

অন্য কোনও শেলের জন্য এই জাতীয় কর্মের দরকার নেই এটি দৃ strong় ইঙ্গিত দেয় যে এটি ওপেনবিএসডি কেএসএস-এ একটি বাগ। আসলে, ksh93 এ জাতীয় সমস্যা দেখায় না।

||কমান্ড লাইনে একটি রয়েছে তা অবশ্যই এর বাম দিকে 1 এর রিটার্ন কোডের ফলে শেল প্রস্থান এড়াতে হবে।

একটি বিশেষ অন্তর্নির্মিত ত্রুটিটি পসিক্সের সাথে অ্যাকর্ডিংহীন একটি ইন্টারেক্টিভ শেলটি প্রস্থান করার কারণ হতে পারে তবে এটি সর্বদা সত্য নয়। continueলুপটি বের করার চেষ্টা করা একটি ত্রুটি, এবং continueএটি অন্তর্নির্মিত। তবে বেশিরভাগ শেলগুলি এ থেকে বের হয় না:

continue 3

একটি বিল্টিন যা একটি পরিষ্কার ত্রুটি নির্গত করে কিন্তু প্রস্থান করে না।

সুতরাং, প্রস্থানটি কমান্ডের অন্তর্নির্মিত বৈশিষ্ট্য দ্বারা নয় ( এই ক্ষেত্রে) শর্ত falseদ্বারা উত্পন্ন হয় ।set -eeval

set -ePOSIX এ ঠিক কোন অবস্থাতে প্রস্থান করা উচিত তা আরও বেশি অস্পষ্ট।


এটি ওপেনবিএসডি মেলিং তালিকাটি থেকে আমি যে প্রতিক্রিয়াটি পেয়েছি তা প্রতিধ্বনিত করে, তবে আরও শব্দ সহ, ধন্যবাদ! আমি একটি সঠিক ত্রুটি প্রতিবেদন বাছাই করব, এবং যদি কিছু না ঘটে তবে আমি উত্স কোডটি নিজেই দেখব।
কুসালানন্দ

4

[দুঃখিত এটি যদি সত্যিকারের উত্তর না হয় তবে আমি যখন এটির কাছাকাছি আসব তখন তা আপডেট করব]

আমি উত্স কোডটি দেখেছি এবং আমার সিদ্ধান্তগুলি হ'ল:

1) এটি একটি বাগ / সীমাবদ্ধতা, এর পিছনে দার্শনিক কিছুই নয়।

2) ওপেনবিএসডি এর ksh ( mksh) এর বহনযোগ্য কাঁটাচামচ থেকে এটির জন্য "ফিক্স" খুব দুর্বল, সত্যই এটি ঠিক না করেই বিষয়গুলিকে আরও খারাপ করে তোলে:

নতুন বাগ, অন্যান্য সমস্ত শেল থেকে পৃথক:

mksh -ec 'eval "false; echo yup"'
yup

bash -ec 'eval "false; echo yup"'
(nothing)

এখনও সত্যই স্থির করা হয়নি:

mksh -ec 'eval "set -e; false" || echo yup'
(nothing)

bash -ec 'eval "set -e; false" || echo yup'
yup

আপনি প্রতিস্থাপন করতে পারেন bashসাথে উপরে dash, zsh, yash, ksh93, ইত্যাদি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.