6. اشکالزدایی
خیلی وقتها، خودتان را مستأصل میبینید که چرا، اسکریپت شما آنگونه عمل نمیکند، که شما میخواهید. حل این مسئله همواره، موضوع درک عمومی و شیوههای اشکالیابی است.
|
تشخیص مشکل |
|
بدون آنکه دقیقاً بدانید مشکل چیست، به احتمال بسیار زیاد، خیلی زود نمیتوانید چارهسازی نمایید. بنابراین مطمئن شوید، که به طور دقیق میدانید چه چیز اشتباه است. علائم و پیغامهای خطا را بررسی و ارزیابی کنید.
سعی کنید مشکل را به صورت یک جمله با قاعده بیان کنید. چون اگر بخواهید از دیگران در حل مشکل کمک بگیرید نیز، این کار خیلی ضروری میباشد. شما که نمیخواهید آنها تمام اسکریپت شما را بازنویسی نمایند، همینطور هم نمیخواهید آنها سرتاسر اسکریپت شما را بازبینی یا آنرا اجرا کنند تاببینند که چه مشکلی پیش میاید. نه،
|
حداقلسازی کد اصلی |
|
اگر اشکالیابی اسکریپت را شروع میکنید، به خودتان الهام خدایی اهدا نکنید، مورد دیگری که باید انجام دهید، کوشش جهت حداقلسازی کد اصلی برای مجزا نمودن مسئله میباشد.
نگران حفظ توانایی اسکریپت خود نباشید. تنها چیزی که باید باقی نگاه دارید، منطق قطعه کد اصلی است، که به نظر مشکل آفرین میباشد.
اغلب، بهترین روش آنست که اسکریپت خود را در یک فایل جدید کپی نموده و شروع به حذف نمودن هر آن چیزی که به نظر میرسد نامربوط است، بنمایید. به طور جایگزین، میتوانید یک اسکریپت جدید که کاری مشابه همان کد انجام میدهد، بسازید، و ساختار را تا ایجاد دوباره مشکل ادامه دهید.
به مجرد اینکه، موردی که مشکل ایجاد نموده را حذف کردید، دست بکشید(یا موردی که اضافه نمودنش دوباره آن مشکل را ظاهر میکند)، شما کشف کردهاید که مشکل در کجا قرار دارد. حتی اگر به طور دقیق به آن نرسیدهاید، حداقل دیگر به یک اسکریپت حجیم خیره نمیشوید، بلکه امیدوارانه، با کوتولهای نه بیش از 3 تا 7 سطر، مواجه هستید.
برای مثال، اگر اسکریپتی دارید که باز کردن فایلهای تصویری موجود در شاخه image را برحسب تاریخ برای شما انجام میدهد، و بنا به دلایلی، تکرار روی فایلهای دایرکتوری را نمیتوانید به طور صحیح پیش ببرید، کافی است اسکریپت را تا اندازه این قطعه کُد کاهش بدهید:
for image in $( ls-R \"$ imgFolder\"); do echo \"$ image \"done
اسکریپت واقعی شما به مراتب پیچیدهتر از این خواهد بود، و درون حلقه
ما نمیتوانیم glob بازگشتی به کار ببریم(مگر در bash نگارش 4)، بنابراین باید دستور find را برای به دست آوردن نام فایلها به کار بگیریم. یک راه اصلاح آن، چنین خواهد بود:
find \"$ imgFolder \"-print0 | while IFS = read-r -d \'\'image ; do echo \"$ image \"done
اکنون که مشکل را در این مثال کوچک برطرف نمودهاید، برگشتن و ترکیب کردن آن با اسکریپ اصلی آسان است.
|
فعال نمودن وضعیت اشکالیابی BASH |
|
اگر بازهم خطای روشهایتان را نمیبینید، شاید وضعیت اشکالیابی BASH برای دیدن مشکل در میان کُد به شما کمک نماید.
موقعی که BASH با گزینه
سه روش برای فعال کردن این وضعیت موجود است.
اجرای اسکریپت به صورت bash
-x :$ bash
-x ./mybrokenscript- ویرایش سرآیند اسکریپت:
#! /bin/bash-x [.. script ..] - یا:
#! /usr/bin/env bash set-x یا اضافه نمودن set
-x در جایی از کُد برای فعال کردن این حالت، منحصراً برای قطعه معینی از کُد:[..کدهای بی ارتباط..] set
-x [..قطعه کد مرتبط..] set+x [..کدهای بی ارتباط..]اگر set
-x شما مقدار زیادی خروجی دارد، ویژگی دلپذیر bash نگارش 4.1 و بالاتر، متغیر BASH_XTRACEFD است. این متغیر امکان تعیین یک توصیفگر فایل برای هدایت خروجی اشکالهای set-x به آن را فراهم میکند. در نسخههای قدیمیتر bash، همواره این خروجی به stderr میرفت، و اگر جدا کردن آن از خروجی معمولی ناممکن نبود، ولی دشوار بود. این هم یک روش دلپسند برای کاربرد آن:# را در یک فایل کپی میکند set -x بخش # با یک نام فایل به عنوان 1$ آنرا فعال میکند # اگر پارامتری وجود نداشته باشد آن را غیر فعال میکند # شماره 4 نباید در جای دیگری از اسکریپت استفاده شده باشد fd
setx_output() { if [[ $ 1 ]] ; then exec4 >> \"$ 1\"BASH_XTRACEFD = 4 set-x else set+x exec4 >& -fi }
اگر اسکریپتهای پیچیده و آشفتهای دارید، شاید تغییر محتوی متغیر PS4 قبل از برقراری اشکالیابی با
exportPS4 = \'+$ BASH_SOURCE :$ LINENO :$ FUNCNAME : \'
|
Step your code |
|
اگر خروجی اشکالیابی از نظر شما خیلی سریع عبور میکند، میتوانید کُد-مرحلهای را فعال کنید. کُد زیر از DEBUG دستور trap برای اطلاع به کاربر در باره دستوری که اجرا خواهد شد و انتظار برای تایید پیشرفت، استفاده میکند. این کُد را در محلی از اسکریپت خود که میخواهید مرحلهای بشود، قرار دهید:
trap \'(read \' DEBUG-p \"[$BASH_SOURCE :$LINENO ] $BASH_COMMAND ?\")
|
اشکالزدای BASH |
|
پروژه اشکالزدای Bash یک اشکالیاب gdb-مانند، در آدرس /http://bashdb.sourceforge.net است.
اشکالیاب فوق به شما کمک میکند در سرتاسر اسکریپت حرکت نموده و اشکالهای آن را پیگردی و پیدا کنید.
|
بازخوانی مستندات |
|
اگر هنوز به نظر میرسد اسکریپت برایتان قابل قبول نیست، شاید ادراک شما از روش انجام کارها اشتباه است. به مستندات(یا این راهنما) رجوع کنید، برای ارزیابی آن که آیا فرمانها درست همانگونه که شما در مورد آنها میاندیشید کارمیکنند، یا دستور زبان کاربرد آنها همانطور است که شما فکر میکنید. بسیاری اوقات، اشخاص در باره چگونگی کارکرد
نکتهها را حفظ کنید و تکرارهای راهنمایی این آموزش را خوب به خاطر بسپارید. اینها غالباً برای پرهیز از مشکلات در اسکریپتها به شما کمک میکنند.
من این مطلب را در بخش اسکریپهای این راهنما نیز اشاره کردهام، اما تکرار آن در اینجا هم با ارزش است. اول از همه، اطمینان حاصل کنید که سرآیند اسکریپت شما به راستی
$ tr
-d \'\\r\' < myscript > tmp && mvtmp myscript
|
پرسش و پاسخها و Pitfallها را بخوانید |
|
صفحههای پرسش و پاسخهای رایج و دامهای Bash تصورات غلط معمول و مشکلاتی که دیگران در اسکریپتهای BASH با آنها روبرو شدهاند را شرح میدهند. احتمال بسیار دارد، مشکل شما به شکلی در آنجا تشریح شده باشد.
برای اینکه قادر به یافتن مشکل خود در آنجا باشید، باید مسئله را به طور کاملاً واضح شناسایی کرده باشید. شما باید بدانید که در جستجوی چه چیزی میباشید.
|
از ما در IRC بپرسید |
|
در 24 ساعت هفت روز هفته، اکثراً افرادی در کانال
مطمئن شوید که میدانید مشکل واقعی چیست و آنرا به صورت مرحلهای روی کاغذ بیاورید، به طوری که خوب بتوانید آنرا شرح بدهید. ما دوست نداریم در مورد مسائل حدس بزنیم. با توضیح آنکه اسکریپت شما چه کاری باید انجام بدهد شروع کنید.
نکته دیگر، لطفاً قبل از ورود به #bash صفحه : XyProblem را ملاحظه نمایید.