কোনও শর্ত ব্যর্থ হলে কীভাবে বাশ স্ক্রিপ্ট বন্ধ করবেন?


11

কমান্ডগুলির প্রয়োগের বিষয়টি বোঝাতে এখানে ||এবং &&এটি একটি একক লাইনে ব্যবহার করাতে দেখায় : আমি কীভাবে ব্যাশ স্ক্রিপ্টে এপট-প্রাপ্ত ত্রুটিগুলি পরীক্ষা করতে পারি?

আমি যদি কোনও শর্তটি ব্যর্থ হয় তবে আমি কোনও স্ক্রিপ্ট সম্পাদন বন্ধ করার চেষ্টা করছি,

যেমন

false || echo "Obvious error because its false on left" && exit

এখানে এটি Obvious error because its false on the leftকনসোলটি প্রিন্ট করে এবং প্রস্থান করে যা আমি যা চাইছিলাম তা।

true || echo "This shouldn't print" && exit

এখানে কোনও ইকো প্রিন্ট নেই তবে exitকমান্ডটিও চলমান, অর্থাৎ কনসোলটি বন্ধ আছে, exitডানদিকের ইকো কমান্ডটি কার্যকর না হওয়ার কারণে কমান্ডটি চালানো উচিত নয় ? বা ডিফল্টরূপে কোনও বিবৃতি &&অপারেটরের বাম দিকে মিথ্যা বলে বিবেচিত হয় ?

সম্পাদনা: আমার আগে এটি উল্লেখ করা উচিত ছিল, আমার লক্ষ্য ছিল ত্রুটি প্রতিধ্বনি করা এবং এটি পরিষ্কার না হলে প্রস্থান করা। && এবং || ব্যবহার করে শর্তাবলী গোষ্ঠীভুক্ত করার সময় আমার ত্রুটিগুলি ধরা সম্পর্কে সুনির্দিষ্ট মামলার প্রতিবেদন করুন, @ বোধি.জাজেন উত্তর সমস্যার সমাধান করে।

@ টকটকটেক উত্তরটি প্রবাহ নিয়ন্ত্রণ সম্পর্কে আরও পরিষ্কার করে তোলে এবং বাশ গাইড লিঙ্কগুলি দুর্দান্ত

@ মুরু উত্তরটি কেন সেট-ই ব্যবহার করবেন না সে সম্পর্কে ভাল ব্যাখ্যা রয়েছে যে আপনি যদি পার্ল এবং ট্র্যাপ ব্যবহারের বিকল্পগুলির সাথে কাস্টম ত্রুটি বার্তা নিক্ষেপ করতে চান যা আমি মনে করি এটি আরও শক্তিশালী উপায় এবং এটি আমার দ্বিতীয় বাশ স্ক্রিপ্ট থেকে আমার নিজের ব্যবহার থেকে দেখুন!


আমি যতদূর বলতে পারি স্ক্রিপ্টটি সম্পন্ন হওয়ার সাথে সাথে এটি প্রস্থান করে।
প্যান্থার

উত্তর:


10

আপনি সম্ভবত চান (স্টিল্ড্রাইভার দ্বারা চিহ্নিত হিসাবে)

true || { echo "This shouldn't print" && exit; }

অন্যথায় আপনার স্ক্রিপ্টটি সময়ে এক শর্তযুক্ত পড়ছে

a বা b এবং তারপরে প্রস্থান করুন

আমি মনে করি আপনি একটি বা (খ এবং প্রস্থান) চান?


4
প্রকৃতপক্ষে, আপনাকে অবশ্যই ব্যবহার করতে হবে{ ... ; } (@ স্টিল্ড্রাইভার প্রস্তাবিত হিসাবে), না হলে exitকেবলমাত্র সাব-শেলটি থেকে বেরিয়ে আসে, এবং প্যারেন্ট শেলটি স্ক্রিপ্টটি চালিয়ে যেতে থাকে।
গর্ডন ডেভিসন

14

সমস্যা হ'ল || এবং & শর্তটি ব্যর্থ হলে কেবল কমান্ড চেইনের একটি পরবর্তী স্তরের এড়িয়ে যান। যদি আপনি একটি সম্পূর্ণ ব্লক কাঠামোটি লিখে থাকেন তবে এটি সঠিকভাবে বোঝায়। আপনি যা লিখেছেন তা হ'ল:

if ! true ; then
   echo "This shouldn't print"
else
   exit
fi

আপনি যা চান তা হ'ল:

if ! true ; then
   echo "This shouldn't print"
   exit
fi

আপনি যখন বাশের শর্টকাট শর্তসাপেক্ষ অপারেটর ব্যবহার করছেন তখন তাদের মিশ্রণ এড়ানো ভাল। আপনি এটি লেখার সময় যুক্তিটি বোঝা অনেক সহজ এবং আপনার পাঠকরা আপনার ভাল স্টাইলের প্রশংসা করবে।


2
হ্যাঁ আমার মতে এটি আরও কতটা
বাশনে

@ টকটকটেক এটি আমার স্পষ্টত কেন এটি ব্যর্থ হয় তা আরও স্পষ্ট করে তোলে। আমি সম্মত হই যে এইটিতে যুক্তিটি পরিষ্কার তবে এটি && এবং || ব্যবহার করে গ্রুপিং শর্তের কারণ নয় শর্তাধীন বিবৃতি ব্যবহার করে তাদের প্রকাশ করা এড়ানো?
কোসোল

@ কোসোল হ্যাঁ, && এবং || দুটি জিনিস একত্রিত করুন: পূর্ববর্তী কমান্ডের প্রস্থান স্থিতি পরীক্ষা করা এবং একটি একক কমান্ড (বা কমান্ড গোষ্ঠী) কার্যকর করতে হবে (এবং && এর জন্য) বা এড়ানো (|| জন্য)। এগুলি খুব সাধারণ ক্ষেত্রে কার্যকর হতে পারে তবে তারা সম্পূর্ণরূপে প্রকাশিত if ... then ... elif ... else ... fiব্লকগুলি প্রতিস্থাপন করতে পারে না । আমি সন্দেহ করি আপনি সচেতন নাও হতে পারেন যে বাশের কাছে আরও পরিশীলিত ভাষায় সত্যিকারের বুলিয়ান প্রকার দেখা যায় না। যদি কোনও কমান্ডের প্রস্থান স্থিতি 0 (শূন্য) হয়, বাশ এটিকে সত্য / সাফল্য হিসাবে বিবেচনা করে । যদি প্রস্থান স্থিতি শূন্য হয় না তবে বাশ এটিকে মিথ্যা / ব্যর্থতা হিসাবে বিবেচনা করে ।
টকটকটেক

7

ত্রুটিতে ব্যর্থ হওয়ার সহজ উপায় হ'ল বাশের -eবিকল্পটি ( set -eবা /bin/bash -eশেবাংয়ে) ব্যবহার করা। তবে এটি কাস্টম ত্রুটি বার্তা প্রেরণ সহজ করে না। এখানে বেশ কয়েকটি আইডিয়াম রয়েছে যা এটিকে সহজ করে তুলতে পারে:

die à লা পার্ল

পার্লের খুব সুবিধাজনক dieকমান্ড রয়েছে যা স্ট্ডারকে একটি বার্তা প্রিন্ট করে এবং একটি ব্যতিক্রম উত্থাপন করে, যা সাধারণত স্ক্রিপ্টটি সমাপ্তির দিকে নিয়ে যায়। আপনি এটি অনুকরণ করতে পারেন:

die () {
  ret=$?
  print "%s\n" "$@" >&2
  exit "$ret"
}

false || die "Obvious error because its false on left"
true || die "This shouldn't print"

trap ERR

trap <command>কমান্ড কমান্ড চালানোর জন্য যখন একটি সংকেত প্রাপ্ত হলে ব্যবহার করা যেতে পারে অথবা যখন স্ক্রিপ্ট (প্রস্থান trap ... EXITকমান্ড), অথবা যখন একটি ত্রুটি ফেরৎ ( trap ... ERR)। সুতরাং যেমন কিছু:

trap 'ret=$?; printf "%s\n" "$ERR_MSG" >&2; exit "$ret"' ERR

তারপর:

ERR_MSG="Obvious error because its false here"
false
ERR_MSG="This shouldn't print"
true

উভয় ক্ষেত্রেই, আমি কমপক্ষে ব্যবহার করার পরামর্শ দেব exit 1, যাতে স্ক্রিপ্টটি ব্যর্থ হয়েছে তা বোঝাতে । একটি সমতল exitপূর্ববর্তী কমান্ডের প্রস্থান স্থিতি ব্যবহার করবে, যা এই ক্ষেত্রেগুলি হ'ল আদেশ echoবা printfআদেশ যা সাধারণত সফল হয়। ব্যর্থ কমান্ডের প্রস্থান স্থিতি সংরক্ষণ যেমন আমি এখানে করেছি একটি সুন্দর করতে হবে।


6

স্ক্রিপ্টটি দিয়ে শুরু করার সাথে আপনি কিছুটা চেষ্টা করার চেষ্টা করতে পারেন

#!/bin/bash -e

এটি নিশ্চিত করে যে স্ক্রিপ্টটি যে কোনও কিছুতে মিথ্যা প্রত্যাবর্তনের মুহুর্তটি উপস্থিত হয়। তারপরে একটি নির্দিষ্ট ব্যর্থতা এড়ানো যায়something || true

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