`সেট-ই` সহ বাশ স্ক্রিপ্টটি &… &&…` কমান্ডে থামে না


14

আমি প্রথম ত্রুটিতে বাশ স্ক্রিপ্ট বন্ধset -e করতে ব্যবহার করি ।

আমি যদি কমান্ডটি ব্যবহার না করি তবে সমস্ত কাজ ঠিক আছে &&:

$ cat script
set -e
cd not_existing_dir && echo 123
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
I'm running! =P
$

সাথে তুলনা করা:

$ cat script
set -e
cd not_existing_dir
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
$

প্রথম উদাহরণটি এখনও প্রতিধ্বনিত হয় I'm running!, তবে দ্বিতীয়টি তা দেয় না। কেন তারা অন্যরকম আচরণ করে?

UPD। অনুরূপ প্রশ্ন: /programming/6930295/set-e-and-short-tests


আপনি প্রথম উদাহরণে কি ঘটবে বলে আশা করছেন?
ফ্লপ

@ ফ্লুপ আমি আশা করি স্ক্রিপ্টটি ব্যর্থ cdকমান্ডের পরে থামবে
907

1
আচরণ অবাক করা জায়গাগুলির সাধারণ আলোচনার জন্য বাশফ্যাঙ্ক # 105 দেখুন set -e
চার্লস ডাফি

উত্তর:


10

এটি নথিভুক্ত আচরণ। ব্যাশ (1) man পৃষ্ঠা , বলছেন জন্য set -e,

শেল থেকে প্রস্থান করলে কমান্ড এটি ব্যর্থ হয় কমান্ড তালিকা অংশ অবিলম্বে অনুসরণ করছে না whileবা until, নিম্নলিখিত পরীক্ষা অংশ শব্দ ifবা elifসংরক্ষিত শব্দ, একটি মৃত্যুদন্ড কার্যকর কোনো কমান্ড অংশ &&বা ||তালিকা কমান্ড ছাড়া চূড়ান্ত নিম্নলিখিত &&বা|| কোন পাইপলাইনে কমান্ডটি কিন্তু শেষ, অথবা যদি কমান্ডের ফেরতের মানটি উল্টানো হয় !
[সামনে জোর দাও.]

এবং পসিক্স শেল কমান্ড ভাষার স্পেসিফিকেশন নিশ্চিত করে যে এটি সঠিক আচরণ:

-eসেটিং যখন যৌগ তালিকা নির্বাহ নিম্নলিখিত উপেক্ষা করা হইবে while, until, if, অথবা elifসংরক্ষিত শব্দ, একটি পাইপলাইন দিয়ে শুরু !সংরক্ষিত শব্দ, অথবা শেষ ছাড়া অন্য একটি এবং-অথবা তালিকার কোন কমান্ড।

এবং অনুচ্ছেদ 2.9.3 তালিকাসমূহ দস্তাবেজটি সংজ্ঞায়িত করে

একটি ও-ওআর তালিকা অপারেটরদের " &&" এবং " ||" দ্বারা পৃথক করা এক বা একাধিক পাইপলাইনের ক্রম ।


9

set -eবিকল্প কিছু পরিস্থিতিতে কার্যকর নেই, এবং এই মান আচরণ এবং POSIX অনুবর্তী শেল জুড়ে পোর্টেবল।


ব্যর্থ কমান্ড পাইপলাইনের একটি অংশ:

false | true; echo printed

মুদ্রণ করবে printed

এবং কেবল পাইপলাইন নিজেই ব্যর্থতা বিবেচনা করা হয়:

true | false; echo 'not printed'

কিছুই প্রিন্ট করা হবে।


নিম্নলিখিত যৌগ তালিকায় ব্যর্থ কমান্ড রান while, until, if, elifসংরক্ষিত শব্দ, একটি পাইপলাইন দিয়ে শুরু !সংরক্ষিত শব্দ অথবা অংশ হিসাবে কোনো কমান্ড &&বা ||গত এক ব্যতীত তালিকা:

false || true; echo printed

শেষ কমান্ডটি এখনও set -eপ্রভাবিত করতে ব্যর্থ হয় :

true && false; echo 'not printed'

Subshell একটি যৌগ কমান্ডে ব্যর্থ হলে:

(false; echo 'not printed') | cat -; echo printed

ধন্যবাদ! এটি ব্যবহার করার জন্য echo "printed"এবং echo "not_printed"আপনার উদাহরণগুলিতে (পরিবর্তে echo 1) পরিষ্কার হবে।
907 তম

3
নোট যেটি set -eবাইরে বেরিয়ে যাওয়ার কারণ হয়ে থাকে (false && true); echo not hereতবে এতে নয় { false && true; }; echo here, যদিও বিভিন্ন শেল এবং একই শেলের বিভিন্ন সংস্করণ সহ ওয়াইএমএমভি। আমি set -eকোনও বার্জ খুঁটির সাথে স্পর্শ করব না এবং পরিবর্তে সঠিক ত্রুটি হ্যান্ডলিং করব।
স্টাফেন চেজেলাস

1

আমার অনুমান যদি পুরোপুরি শর্তটি সত্য হিসাবে মূল্যায়ন করে।

আমি চেষ্টা করেছিলাম

set -e
if cd not_existing_dir
then  echo 123
fi
echo "I'm running! =P"

কে দেয়

-bash: cd: not_existing_dir: No such file or directory
I'm running! =P

ত্রুটি কোডটি যদি শর্তযুক্ত হয় তবে এটি কার্যকরভাবে শেষ করতে পারে না ash


তবে আমি ব্যবহার করি নাif ... fi
907th

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