সাব- exit
শেলের মধ্যে সম্পাদন করা একটি ক্ষতি:
#!/bin/bash
function calc { echo 42; exit 1; }
echo $(calc)
স্ক্রিপ্টটি 42 টি মুদ্রণ করে, রিটার্ন কোড সহ সাবশেল থেকে প্রস্থান করে 1
এবং স্ক্রিপ্টটি দিয়ে চালিয়ে যায়। এমনকি কলটি প্রতিস্থাপন করাও echo $(CALC) || exit 1
সহায়তা করে না কারণ রিটার্ন কোডটি echo
0 এর রিটার্ন কোড নির্বিশেষে 0 হয় calc
। এবং calc
আগে মৃত্যুদন্ড কার্যকর করা হয় echo
।
এমনকি আরও বিরক্তিকর প্রভাব thwarting হয় exit
সেটিকে মোড়কে local
নিম্নলিখিত লিপিতে মত builtin। আমি যখন কোনও ইনপুট মান যাচাই করতে কোনও ফাংশন লিখেছিলাম তখন আমি সমস্যার জন্য হোঁচট খেয়েছি। উদাহরণ:
আমি 20141211.log
আজ বছরের জন্য "বছরের মাসের দিন.লগ" নামে একটি ফাইল তৈরি করতে চাই । তারিখটি কোনও ব্যবহারকারীর ইনপুট যা যুক্তিসঙ্গত মান প্রদান করতে ব্যর্থ হতে পারে। অতএব, আমার ফাংশনে fname
আমি date
ব্যবহারকারীর ইনপুটটির বৈধতা যাচাই করতে ফেরতের মানটি পরীক্ষা করি :
#!/bin/bash
doit ()
{
local FNAME=$(fname "$1") || exit 1
touch "${FNAME}"
}
fname ()
{
date +"%Y%m%d.log" -d"$1" 2>/dev/null
if [ "$?" != 0 ] ; then
echo "fname reports \"Illegal Date\"" >&2
exit 1
fi
}
doit "$1"
ভাল লাগছে। স্ক্রিপ্টটির নাম দেওয়া হোক s.sh
। যদি ব্যবহারকারী স্ক্রিপ্টটি সাথে কল করে ./s.sh "Thu Dec 11 20:45:49 CET 2014"
তবে ফাইলটি 20141211.log
তৈরি হয়। তবে, যদি ব্যবহারকারী টাইপ করে ./s.sh "Thu hec 11 20:45:49 CET 2014"
তবে স্ক্রিপ্ট আউটপুট দেয়:
fname reports "Illegal Date"
touch: cannot touch ‘’: No such file or directory
লাইনটি fname…
জানিয়েছে যে সাবসেলের মধ্যে খারাপ ইনপুট ডেটা সনাক্ত করা হয়েছে। তবে লাইনের exit 1
শেষে local …
কখনই ট্রিগার হয় না কারণ local
নির্দেশ সর্বদা ফিরে আসে 0
। এটি কারণ পরেlocal
মৃত্যুদন্ড কার্যকর করা হয় $(fname)
এবং এভাবে তার রিটার্ন কোডটি ওভাররাইট করে। এবং সে কারণে, স্ক্রিপ্টটি অবিরত থাকে এবং touch
একটি খালি প্যারামিটার সহ প্রার্থনা করে । এই উদাহরণটি সহজ তবে বাশের আচরণ একটি বাস্তব প্রয়োগে বেশ বিভ্রান্তিকর হতে পারে। আমি জানি, প্রকৃত প্রোগ্রামাররা স্থানীয় ব্যবহার করে না ☺
এটি পরিষ্কার করার জন্য: local
স্ক্রিপ্টটি যখন কোনও অবৈধ তারিখ প্রবেশ করা হয় তখন প্রত্যাশা অনুযায়ী স্ক্র্যাপটি বাতিল হয়।
ফিক্সটি লাইনের মতো বিভক্ত করতে হবে
local FNAME
FNAME=$(fname "$1") || exit 1
অদ্ভুত আচরণটি ব্যাশের local
ম্যান পেজের মধ্যে ডকুমেন্টেশনের সাথে সঙ্গতিপূর্ণ: "রিটার্নের স্থিতি 0 হয় যদি না কোনও ফাংশনের বাইরে স্থানীয় ব্যবহার করা হয়, একটি অবৈধ নাম সরবরাহ করা হয় না, বা নামটি কেবল পঠনযোগ্য পরিবর্তনশীল" "
বাগ না হওয়া সত্ত্বেও আমি অনুভব করি যে বাশের আচরণটি বিপরীত। আমি মৃত্যুদন্ডের ক্রম সম্পর্কে সচেতন local
, তবুও কোনও ভাঙা অ্যাসাইনমেন্টটি মাস্ক করা উচিত নয়।
আমার প্রাথমিক উত্তরে কিছু ভুলত্রুটি রয়েছে। মাইক্রোজারের সাথে একটি প্রকাশ্য এবং গভীর আলোচনার পরে (তার জন্য আপনাকে ধন্যবাদ) আমি সেগুলি স্থির করতে গিয়েছিলাম।