linux - কোন কমান্ড একটি শূন্য শূন্য মান ফেরত যদি একটি শেল স্ক্রিপ্ট বাতিল?




bash unix (6)

আপনার উদাহরণ বিবৃতি অপ্রয়োজনীয় হয়। শুধু এটি ভালো করুন:

dosomething1 || exit 1

আপনি যদি উইল লৌড়িকারি এর পরামর্শ গ্রহণ করেন এবং set -e ব্যবহার করেন তবে কিছু কমান্ডের জন্য আপনাকে এটি ব্যবহার করতে হবে:

dosomething || true

|| true কমান্ড পাইপলাইনের true ফিরতি মান থাকলেও কমান্ডটি ব্যর্থ হয়, তাই -e বিকল্পটি স্ক্রিপ্টটিকে হত্যা করবে না।

আমার কাছে একটি বাশ শেল স্ক্রিপ্ট রয়েছে যা কয়েকটি কমান্ড চালায়। যদি কোন কমান্ড অ-শূন্য মান প্রদান করে তবে আমি শেল স্ক্রিপ্টটি 1 এর রিটার্ন মান দিয়ে স্বয়ংক্রিয়ভাবে প্রস্থান করতে চাই।

স্পষ্টভাবে প্রতিটি কমান্ড ফলাফল চেক ছাড়া এই সম্ভব?

যেমন

dosomething1
if [[ $? -ne 0 ]]; then
    exit 1
fi

dosomething2
if [[ $? -ne 0 ]]; then
    exit 1
fi

আপনার যদি ক্লিনআপ থাকে তবে আপনাকে প্রস্থান করার প্রয়োজন হবে, আপনি ছদ্ম-সংকেত ERR এর সাথে 'ফাঁদ' ব্যবহার করতে পারেন। এটি INT বা অন্য কোনও সংকেত আটকানোর মতো একই কাজ করে; কোন কমান্ড একটি nonzero মান সঙ্গে exits যদি bash ERR ছুড়ে ফেলে:

# Create the trap with   
#    trap COMMAND SIGNAME [SIGNAME2 SIGNAME3...]
trap "rm -f /tmp/$MYTMPFILE; exit 1" ERR INT TERM
command1
command2
command3
# Partially turn off the trap.
trap - ERR
# Now a control-C will still cause cleanup, but
# a nonzero exit code won't:
ps aux | grep blahblahblah

অথবা, বিশেষ করে যদি আপনি "সেট-ই" ব্যবহার করেন তবে আপনি EXIT আটকে ফেলতে পারেন; স্ক্রিপ্টটি তখনই কার্যকর হবে যখন কোনও কারণে স্ক্রিপ্টটি স্বাভাবিক সমাপ্তি, ব্যবধান, ই-বিকল্পের কারণে প্রস্থান, ইত্যাদি সহ প্রস্থান করে।


মত একটি অভিব্যক্তি

dosomething1 && dosomething2 && dosomething3

কমান্ডের একটি অ শূন্য মান সঙ্গে ফেরৎ যখন প্রক্রিয়াকরণ বন্ধ হবে। উদাহরণস্বরূপ, নিম্নলিখিত কমান্ড "সম্পন্ন" মুদ্রণ করবে না:

cat nosuchfile && echo "done"
echo $?
1

মার্ক এগার্স ইনপুট করার জন্য একটি অতিরিক্ত প্রশ্ন ছিল, কারণ শুধুমাত্র রেফারেন্সের জন্য অন্য একটি মধ্যে নিক্ষেপ এবং এখানে সামগ্রিক বিষয় একটি অতিরিক্ত উদাহরণ এবং স্পর্শ:

[[ `cmd` ]] && echo success_else_silence

যা cmd || exit errcode হিসাবে একই cmd || exit errcode কেউ দেখিয়েছেন হিসাবে cmd || exit errcode

যেমন। মাউন্ট করা থাকলে পার্টিশনটি আনমাউন্ট করা আছে কিনা তা নিশ্চিত করতে চাই:

[[ `mount | grep /dev/sda1` ]] && umount /dev/sda1 

স্ক্রিপ্টের শুরুতে এটি যুক্ত করুন:

set -e

একটি সহজ কমান্ড একটি nonzero প্রস্থান মান সঙ্গে নির্গত হলে এই শেল অবিলম্বে প্রস্থান করা হবে। একটি সাধারণ কমান্ড কোনও কমান্ড যদি কোন, কখন, বা পরীক্ষার অংশ না হয়, এবং একটি && অথবা || তালিকা।

আরও বিস্তারিত জানার জন্য "সেট" অভ্যন্তরীণ কমান্ডে ব্যাশ (1) ম্যান পৃষ্ঠা দেখুন।

আমি ব্যক্তিগতভাবে "সেট-ই" সহ প্রায় সব শেল স্ক্রিপ্ট শুরু করি। মাঝখানে কিছু ব্যর্থ হলে স্ক্রিপ্টের বাকি অংশের জন্য অনুমানগুলি ভেঙ্গে পড়লে এটি একটি স্ক্রিপ্টটি হঠাৎ চলতে থাকে।


$? পরিবর্তনশীল খুব কমই প্রয়োজন। ছদ্ম-idiom command; if [ $? -eq 0 ]; then X; fi command; if [ $? -eq 0 ]; then X; fi command; if [ $? -eq 0 ]; then X; fi সবসময় সবসময় if command; then X; fi হিসাবে লেখা উচিত if command; then X; fi if command; then X; fi if command; then X; fi

যেখানে ক্ষেত্রে $? এটি একাধিক মানের বিরুদ্ধে চেক করার প্রয়োজন হয় যখন হয়:

command
case $? in
  (0) X;;
  (1) Y;;
  (2) Z;;
esac

অথবা যখন $? পুনঃব্যবহৃত করা বা অন্যথায় ম্যানিপুলেট করা প্রয়োজন:

if command; then
  echo "command successful" >&2
else
  ret=$?
  echo "command failed with exit code $ret" >&2
  exit $ret
fi





shell