اولین کاری که باید قبل از شروع به نوشتن یک اسکریپت پوسته یا هر نوع اسکریپت یا برنامهای مشابه آن، انجام بدهید، برشمردن احتیاجات و اهداف آن اسکریپت است. سپس ارزیابی آنچه، بهترین ابزار برای انجام آن اهداف است.
BASH ممکن است برای یادگیری و نوشتن در آن آسان باشد، اما همیشه مناسب انجام کار نیست.
در مجموعه ابزارهای اساسی، تعداد بسیاری ابزار موجود است که میتواند به شما کمک کند. اگر شما فقط به AWK نیاز داشته باشید، نباید یک اسکریپت شل ایجاد کنید که آن را فراخوانی کند. فقط یک اسکریپت AWK ایجاد کنید. اگر به بازیابی داده از یک فایل HTMLیا XML به یک روش معتبر نیاز دارید، نیز Bash ابزار اشتباهی برای انجام آن کار است. باید به جای آن XPath/XSLT را به کار ببرید، یا یک زبانی که کتابخانه معتبری برای تجزیه XML یا HTML دارد.
اگر تصمیم گرفتید که اسکریپت پوسته آن ابزاری است که شما میخواهید، اول این سؤالها را از خود بپرسید:
در یک آینده قابل پیشبینی، آیا ممکن است اسکریپت شما در محیطی که Bash به طور پیشفرض در دسترس نیست، مورد احتیاج باشد؟
اگر اینطور است، پس به جای آن sh را در نظر بگیرید. sh یک شل POSIX است و ویژگیهایش در هر پوسته موافق با استاندارد POSIX، در دسترس میباشد. به این واقعیت تکیه کنید که هر سیستم POSIX قادر به اجرای اسکریپت شما خواهد بود. شما باید توازنی بین لزوم قابلیت حمل و عدم استفاده از قابلیتهای ویژه Bash برقرار کنید.
به خاطر داشته باشید که این راهنما شامل sh نمیشود! صفحه bashism پیشنهادهایی دارد، اما کامل نیست.
اگر نه، باید خود را فقط به ویژگیهای Bash 2.x محدود نمایید.
اگر سؤلات فوق انتخاب شما را محدود نمیکند، از تمام ویژگیهای Bash که لازم دارید، استفاده کنید، توجه کنید که کدام نگارش Bash برای اجرای اسکریپت شما لازم است.
استفاده از Bash نگارش 3 یا بالاتر به معنای آنست که میتوانید از شیوههای اسکریپتنویسی کهنه و قدیمی که به دلایل بسیار خوبی با موارد خیلی بهتری جایگزین شدهاند، اجتناب نمایید.
همواره از شبانگ صحیح استفاده کنید. اگر در حال نوشتن اسکریپت هستید، قرار دادن
موقع نوشتن اسکریپتهای پوسته، از دستور [ استفاده نکنید. Bash جایگزین بسیار بهتری دارد:
وقت آنست که `...` نیز به فراموشی سپرده شود. این مورد با ساختار بسط سازگار نیست. به جای آن از
و به واسطه قدرت شگرف، "کاربرد بیشتر نقلقولها!" رشتهها و بسط پارامترهای خود را از تفکیک کلمات محافظت کنید. اگر به طور صحیح نقلقولی نکنید، تفکیک کلمات نوزادان شما را میخورد.
به جای استفاده از sed یا cut برای کار با رشتههای ساده در Bash، استفاده از بسط پارامترها را بیاموزید. اگر میخواهید پسوند نام فایل را حذف کنید، به جای
به جای استفاده از expr برای انجام محاسبات ساده، از حساب داخلی استفاده کنید، مخصوصاً وقتیکه فقط مقدار متغیری افزایش مییابد. اگر اسکریپتی میخوانید که
تفکیک کلمه اهریمن درون BASH است که با جدیت تلاش میکند تازهواردها یا حتی کهنه سربازانی که سپر محافظ خود را زمین میگذارند، را غافلگیر کند.
اگر درک نکنید که تفکیک کلمه چطور کار میکند یا چه وقت اِعمال میشود، در استفاده از رشتهها و بسط پارامترها باید بسیار مراقب باشید. پیشنهاد میکنم اگر در مورد آگاهی خود تردید دارید،بیشتر در باره تفکیک کلمه مطالعه کنید.
بهترین روش محافظت خود از این جانور، نقلقولی کردن تمام رشتههایتان است. نقلقولها، رشتههای شما را به صورت یکپارچه نگاه میدارند تفکیک کلمه را از گسستن آنها منع میکنند. اجازه بدهید تشریح کنم:
$ echo Push that word away from me.Push that word away from me. $ echo" Push that word away from me." Push that word away from me.
حال، تصور نکنید که تفکیک کلمه برای فرو ریختن فاصلههاست. آنچه به طور واقعی در این مثال اتفاق میافتد، آنست که در مثال اول، هر یک از کلمات جمله ما به عنوان یک شناسه( argument) جداگانه به echo تحویل داده میشود. BASH جمله ما را به کلمات تجزیه میکند، از فضای سفید برای تعیین آن که هر شناسه از کجا شروع و به کجا ختم میگردد، استفاده مینماید. در مثال دوم BASH وادار شده تمام رشته نقلقولی شده را با هم نگاه دارد. به این معنا که به شناسهها تفکیک نمیشوند و تمام رشته به عنوان یک شناسه به echo تحویل میشود. دستور echo همه شناسههایی که به آن داده شود را با یک فاصله مابین آنها در خروجی چاپ میکند. اکنون باید اساس تجزیه کلمه را متوجه شده باشید.
اینجاست که خطرناک میشود: تفکیک کلمه فقط در رشتههای لفظی اتفاق نمیافتد. این مطلب بعد از بسط پارامتر نیز رخ میدهد! در نتیحه، در یک شرایط رکود و خستگی، شاید برای انجام این خطا، به اندازه کافی کند ذهن شده باشید:
$sentence = "Push that word away from me." $ echo$ sentence Push that word away from me. $ echo "$ sentence "Push that word away from me.
به طوری که ملاحظه میکنید، در دستور echo اول، سهلانگاری کرده و نقلقولها را از قلم انداختهایم. یک اشتباه بود. BASH جمله ما را بسط داده و سپس از تفکیک کلمه برای تجزیه نتیجه بسط به شناسهها جهت تحویل به echo استفاده نموده. در دومین مثال، نقلقولها در اطراف بسط پارامتر جمله، اطمینان ایجاد میکند که BASH آن را به چندین شناسه پیرامون فضاهای سفید تجزیه نمیکند.
فقط فاصلهها نیستند که باید محافظت شوند. تفکیک کلمه در فاصلهها، tabها، سطر جدید، یا هر کاراکتر دیگری که در متغیر
$ echo "$(ls "-al )total 8 drwxr-xr-x 4 lhunath users 1 2007-06-28 13:13 "."/ drwxr-xr-x 102 lhunath users 9 2007-06-28 13:13 ".."/ -rw-r--r-- 1 lhunath users 0 2007-06-28 13:13 "a" -rw-r--r-- 1 lhunath users 0 2007-06-28 13:13 "b" -rw-r--r-- 1 lhunath users 0 2007-06-28 13:13 "c" drwxr-xr-x 2 lhunath users 1 2007-06-28 13:13 "d"/ drwxr-xr-x 2 lhunath users 1 2007-06-28 13:13 "e"/ $ echo$(ls -al )total 8 drwxr-xr-x 4 lhunath users 1 2007-06-28 13:13 "."/ drwxr-xr-x 102 lhunath users 9 2007-06-28 13:13 ".."/ -rw-r--r-- 1 lhunath users 0 2007-06-28 13:13 "a" -rw-r--r-- 1 lhunath users 0 2007-06-28 13:13 "b" -rw-r--r-- 1 lhunath users 0 2007-06-28 13:13 "c" drwxr-xr-x 2 lhunath users 1 2007-06-28 13:13 "d"/ drwxr-xr-x 2 lhunath users 1 2007-06-28 13:13 "e"/
در موقعیتهای بسیار نادری ممکن است، صرفنظر از نقلقولها مطلوب باشد. مواردی که شما نیاز به انجام تفکیک کلمه داشته باشید:
$friends = "Marcus JJ Thomas Michelangelo" $for friend in $ friends >do echo "$ friend is my friend!"; done Marcus is my friend! JJ is my friend! Thomas is my friend! Michelangelo is my friend!
اما، صادقانه؟ برای چنین حالاتی باید از آرایهها استفاده کنید. آرایهها این فایده را دارند که بدون نیاز به جداکننده صریح، رشتهها را جدا میکنند. این به آن معنا میباشد، که رشتههای شما میتوانند شامل هر کاراکتر معتبر(غیرتهی) باشند، بدون آنکه نگران جداکننده بودن کاراکتر باشید(مانند فاصله در مثال فوق). به کار بردن آرایه در مثال فوق ما را قادر میکند نام فامیل دوستان را نیز اضافه کنیم:
$friends =( "Marcus The Rich" "JJ The Short" "Timid Thomas" "Michelangelo The Mobster") $for friend in "$ { friends [@] } " >do echo "$ friend is my friend!"; done
توجه نمایید که در حلقه
تقریباً خوانایی کد شما به همان اندازه نتایج آن اهمیت دارد.
احتمال نمیرود که اسکریپتی را فقط برای یکبار بنویسید و بعد فراموشش کنید. اگر چنین باشد، باید آنرا اجرا نموده و سپس حذف کنید. اگر خیال دارید استفاده از آن را ادامه دهید، باید طرحی برای نگهداری از آن داشته باشید. برخلاف اطاقتان، کدهای شما نمیتوانند زمان زیادی کثیف باشند، اما شما به طور دائم رویکردها و شیوههای نوینی فرا میگیرید. همچنین بینش جدیدی در خصوص چگونگی کاربرد اسکریپت خود به دست میآورید. تمام اطلاعات جدیدی که حین تکمیل کد ابتدایی خود به دست میآورید، باید به طریقی در حفظ و نگهداری کد شمابه کار گرفته شود، که به طور مداوم آن را بهبود بدهد. کد شما بایستی در جهت کاربر محوری و پایداری بیشتر رشد کند.
برای اینکه سالم نگهداری کدهایتان را آسانتر نمایید و به طور مرتب آنها را اصلاح کنید، باید نگاهتان را متوجه خوانایی آنچه مینویسید، بنمایید. وقتی پس از مدت طولانی، به اسکریپتی که از آخرین بازبینی آن یکسال گذشته، باز میگردید و میخواهید آن را اصلاح کنید، یک ویژگی جدید اضافه کنید، یا اشکالی را در آن رفع نمایید، مرا یاد کنید که میگویم ترجیحاً این مورد را ببینید:
1 friends =( "Marcus The Rich" "JJ The Short" "Timid Thomas" "Michelangelo The Mobster" )
2
3 # مطالب مهمی در باره دوستانم میگوید
4 for name in "$ { friends [@] } "; do
5
6 #(اولین دوست من (در لیست
7 if [[ $ name = $ { friends [0] } ]] ; then
8 echo $ name was my first friend.
9
10 # شروع میشود M دوستان من که نامشان با
11 elif [[ $ name = M* ]] ; then
12 echo "$ name starts with an M"
13
14 # دوستان کوتاه من
15 elif [[ " $ name " = * " Short "* ]] ; then
16 echo "$ name is a shorty."
17
18 # دوستانی که زحمت بخاطر سپردن آنها را نمیکشم
19 else
20 echo "I kind of forgot what $ name is like."
21
22 fi
23 done
تا اینکه با موردی مشابه این روبرو شوید:
1 x=( Marcus\ The\ Rich JJ\ The\ Short
2 Timid\ Thomas Michelangelo\ The\ Mobster)
3 for name in "${x[@]}"
4 do if [ "$name" = "$x" ]; then echo $name was my first friend.
5 elif
6 echo $name | \
7 grep -qw Short
8 then echo $name is a shorty.
9 elif [ "x${name:0:1}" = "xM" ]
10 then echo $name starts with an M; else
11 echo I kind of forgot what $name \
12 is like.; fi; done
و بله، میدانم که این مثال کمی اغراقآمیز است، اما من بعضی کدهای معتبری را دیدهام که واقعاً شباهت بسیاری به مثال اخیر دارند.
برای سلامت خودتان این چند نکته را به یاد داشته باشید:
فضای سفید مناسب به شما فضای تنفس میدهد. کدهایتان را به طور صحیح و نامتناقض دندانهدار نمایید. از سطرهای خالی برای جداکردن پاراگرافها یا بلوکهای منطقی استفاده کنید.
از پوشش با کاراکتر
روش تفکرتان را، یادداشت کنید، قبل از اینکه آن را فراموش کنید. ممکن است دریابید، کدی که کاملاً متعارف حس میشود، میتواند موضوع "چه جهنمی فکر میکردم، وقتی این را نوشتم؟" یا "تصور انجام چه کاری از این داشتم؟".
سازگاری از ناراحتی ذهن پیشگیری میکند. در شیوه نامگذاری استوار باشید. در استفاده از حروف بزرگ سازگار باشید. در استفاده خود از ویژگیهای پوسته پایدار باشید. در کدنویسی، برخلاف اطاقخواب، خوبست ساده و قابل پیش بینی باشید.
فرمان test که به عنوان [ نیز شناخته شده، یک برنامه کاربردی است که به طور معمول جایی در /usr/bin یا /bin استقرار مییابد و توسط برنامهنویس پوسته برای اجرای آزمایشهای معینی با متغیرها و فایلها، خیلی زیاد به کار میرود. در تعدادی از پوستهها، از جمله Bash, دستور test به صورت دستور داخلی پوسته نیز پیادهسازی گردیده است.
این مورد میتواند نتایج شگفانگیزی فراهم نماید، به ویژه برای آنان که شروع به اسکریپتنویسی پوسته مینمایند و تصور میکنند
اگر از پوسته sh استفاده میکنید، انتخاب کمی دارید و استفاده از test تنها راه انجام اکثر بررسیهایتان میباشد.
گرچه اگر از Bash در اسکریپتنویسی استفاده میکنید(و من فرض میکنم چنین است، چون در حال خواندن این راهنما هستید)، پس میتوانید از کلید واژه
اجازه بدهید تشریح کنم که چگونه
$var = '' $[ $ var = '' ]&& echo True -bash: [: =: unary operator expected $[ "$ var "= '' ]&& echo TrueTrue $[[ $ var = '' ]] && echo TrueTrue
قسمت
بله، test متغیر تهی
حال آنکه،
$var = $[ "$ var "< a ]&& echo True-bash: a: No such file or directory $[ "$ var "\< a ]&& echo TrueTrue $[[ $ var < a ]] && echo TrueTrue
در این مثال سعی نمودهایم یک مقایسه رشتهای بین یک متغیر تهی و '
ما توسط تغییر مسیر فایل گَزیده شدهایم. چون test دقیقاً یک برنامه کاربردی است، کاراکتر
با استفاده از
حتی خطرناکتر، استفاده از عملگر
$var = a $[ "$ var "> b ]&& echo True|| echo FalseTrue $[[ "$ var "> b ]] && echo True|| echo FalseFalse
دو نتیجه متفاوت، شگرف. به من اعتماد کنید، وقتی میگویم، همیشه میتوانید به
با کاربرد
بنابراین به من باور داشته باشید، وقتی میگویم،
گذشته ازاین،
تنها برتری test قابلیت حمل آن است.
پوسته Bash امکان انجام کارهای بسیاری برای شما فراهم میکند، ارائه قابلیت انعطافپذیری قابل ملاحظه به شما. متأسفانه، خیلی کم شما را از سوءمصرف و دیگر رفتارهای نامطلوب، بر حذر میدارد. امید میرود، اشخاص خودشان دریابند که از برخی مسائل معین باید به هر قیمتی پرهیز نمایند.
متأسفانه بسیاری اشخاص به اندازه کافی دقیق و مراقب نیستند که بخواهند خودشان موشکافی کنند. آنها بدون اندیشیدن در مورد مسائل، مینویسند و بسیاری از اسکریپتهای خطرناک و مهیب به محیطهای تولید و یا توزیعهای لینوکس ختم میشود. نتیجه اینها، و حتی اسکریپتهای خیلی شخصی شما در یک شرایط اهمال اغلب میتواند مصیبتآمیز بشود.
برای پاکیزگی اسکریپتهایتان، و به خاطر تمام افراد بشر، هرگز هیچ موردی از سطور زیر را انجام ندهید:
ls
هرگز تجزیه خروجی فرمان ls را انجام ندهید! خروجی فرمان ls به چند دلیل نمیتواند قابل اعتماد باشد.
اول، اگر نام فایلها شامل کاراکترهای پشتیبانی نشده زبان محلی شما باشد، ls نامها را خُرد خواهد نمود. در نتیجه، خروجی حاصل از تجزیه نام فایلها توسط ls، هرگز تضمین نمیشود که واقعاً همان نامهایی که شما قادر به یافتن آنها میباشید را به شما بدهد. ls ممکن است بعضی کاراکترها در نام فایل را با کاراکتر علامت سؤال تعویض نماید.
دوم، ls سطرهای دادهها را بر اساس کاراکتر سطر جدید تفکیک میکند. به این طریق، هر تکه از اطلاعات یک فایل در یک سطر است. متأسفانه، نام فایلها نیز خودشان میتوانند شامل سطر جدید باشند. این به معنی آنست که اگر شما فایلی در دایرکتوری جاری با نام شامل کاراکتر سطر جدید داشته باشید، کاملاً نتیجه تجزیه شما را درهم میریزد و اسکریپت شکست میخورد!
آخر از همه، اما نه کم اهمیتتر، قالب خروجی فرمان ls
در موقعیتهای بسیاری جایگزینهایی برای ls وجود دارد. اگر لازم است که شما با زمان ویرایش فایل کار کنید، به طور نمونه میتوانید از بررسیهای Bash استفاده کنید. اگر هیچ یک از آنها میسر نباشد، پیشنهاد میکنم زبان متفاوتی، همچون پرل یا python انتخاب کنید.
ls
هرگز نام فایل ها را با grep بررسی یا فیلتر نکنید! غیر از آنکه الگوی grep شما واقعاً هوشمند باشد، این کار احتمالاً قابل اطمینان نخواهد بود.
در نمونه اول مثال فوق، بررسی با هر دو مورد
جایگزین آن globbing نامیده میشود(
cat
برنامه cat را برای خوراندن محتویات یک فایل منفرد به یک فیلتر به کار نبرید. cat یک ابزار مورد استفاده برای الحاق محتویات چند فایل با یکدیگر است.
برای تغذیه محتویات فایلی به یک پردازش، احتمالاً میتوانید نام فایل را به عنوان شناسه تحویل برنامه مورد نظر(مانند grep '
اگر مستندات برنامه هیچ راهی برای انجام این کار تعیین نکرده است، باید از تغییر مسیر استفاده کنید (read
از حلقه for برای خواندن سطرهای یک فایل استفاده نکنیم. به جای آن حلقه while read را به کار ببریم.
به خاطر خدا و به خاطر تمام مقدسات، از برنامه seq برای شمارش استفاده نکنید.
Bash به اندازه کافی در انجام شمارش توانمند است. نیازی به یک برنامه خارجی(مخصوصاً یک برنامه تک سکویی) برای انجام محاسبه و ارسال آن به خروجی Bash جهت تفکیک کلمه، ندارید. ترکیب دستوری
باید در Bash نگارش 3 به بعد، از این:
اگر شما عملاً یک جریانی از اعداد که با کاراکتر سطر جدید از هم جدا شدهاند، هنگام بررسی ورودی میخواهید، این مورد را در نظر بگیرید: printf
expr یک عتیقه رُم باستان است. آن را به کار نبرید.
این برنامه در اسکریپتهای نوشته شده برای پوستههایی با امکانات بسیار محدود، به کار میرفت. اساساً با استفاده از آن در حال ایجاد یک پردازش جدید هستید که برنامه C دیگری برای انجام برخی محاسبات را برایتان فراخوانی نماید و نتایج را به صورت رشته به bashتحویل بدهد. Bash تمام اینها را خودش میتواند خیلی سریعتر، و به طور قابل اعتمادتر (بدون تبدیل عدد به ->رشته -> به عدد) و در همه حال بهتر، انجام بدهد.
شما در Bash باید از این استفاده کنید: let
حتی پوسته POSIX بورن میتواند محاسبات را انجام بدهد:
خیلی وقتها، خودتان را مستأصل میبینید که چرا، اسکریپت شما آنگونه عمل نمیکند، که شما میخواهید. حل این مسئله همواره، موضوع درک عمومی و شیوههای اشکالیابی است.
|
تشخیص مشکل |
|
بدون آنکه دقیقاً بدانید مشکل چیست، به احتمال بسیار زیاد، خیلی زود نمیتوانید چارهسازی نمایید. بنابراین مطمئن شوید، که به طور دقیق میدانید چه چیز اشتباه است. علائم و پیغامهای خطا را بررسی و ارزیابی کنید.
سعی کنید مشکل را به صورت یک جمله با قاعده بیان کنید. چون اگر بخواهید از دیگران در حل مشکل کمک بگیرید نیز، این کار خیلی ضروری میباشد. شما که نمیخواهید آنها تمام اسکریپت شما را بازنویسی نمایند، همینطور هم نمیخواهید آنها سرتاسر اسکریپت شما را بازبینی یا آنرا اجرا کنند تاببینند که چه مشکلی پیش میاید. نه،
|
حداقلسازی کد اصلی |
|
اگر اشکالیابی اسکریپت را شروع میکنید، به خودتان الهام خدایی اهدا نکنید، مورد دیگری که باید انجام دهید، کوشش جهت حداقلسازی کد اصلی برای مجزا نمودن مسئله میباشد.
نگران حفظ توانایی اسکریپت خود نباشید. تنها چیزی که باید باقی نگاه دارید، منطق قطعه کد اصلی است، که به نظر مشکل آفرین میباشد.
اغلب، بهترین روش آنست که اسکریپت خود را در یک فایل جدید کپی نموده و شروع به حذف نمودن هر آن چیزی که به نظر میرسد نامربوط است، بنمایید. به طور جایگزین، میتوانید یک اسکریپت جدید که کاری مشابه همان کد انجام میدهد، بسازید، و ساختار را تا ایجاد دوباره مشکل ادامه دهید.
به مجرد اینکه، موردی که مشکل ایجاد نموده را حذف کردید، دست بکشید(یا موردی که اضافه نمودنش دوباره آن مشکل را ظاهر میکند)، شما کشف کردهاید که مشکل در کجا قرار دارد. حتی اگر به طور دقیق به آن نرسیدهاید، حداقل دیگر به یک اسکریپت حجیم خیره نمیشوید، بلکه امیدوارانه، با کوتولهای نه بیش از 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
$ bash-x ./mybrokenscript
#! /bin/bash-x [.. script ..]
#! /usr/bin/env bash set-x
یا اضافه نمودن set
[..کدهای بی ارتباط..] set-x [..قطعه کد مرتبط..] set+x [..کدهای بی ارتباط..]
اگر set
# را در یک فایل کپی میکند 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 را ملاحظه نمایید.