সাব- exitশেলের মধ্যে সম্পাদন করা একটি ক্ষতি:
#!/bin/bash
function calc { echo 42; exit 1; }
echo $(calc)
স্ক্রিপ্টটি 42 টি মুদ্রণ করে, রিটার্ন কোড সহ সাবশেল থেকে প্রস্থান করে 1এবং স্ক্রিপ্টটি দিয়ে চালিয়ে যায়। এমনকি কলটি প্রতিস্থাপন করাও echo $(CALC) || exit 1সহায়তা করে না কারণ রিটার্ন কোডটি echo0 এর রিটার্ন কোড নির্বিশেষে 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, তবুও কোনও ভাঙা অ্যাসাইনমেন্টটি মাস্ক করা উচিত নয়।
আমার প্রাথমিক উত্তরে কিছু ভুলত্রুটি রয়েছে। মাইক্রোজারের সাথে একটি প্রকাশ্য এবং গভীর আলোচনার পরে (তার জন্য আপনাকে ধন্যবাদ) আমি সেগুলি স্থির করতে গিয়েছিলাম।