ما قبلا در مورد debug کردن shell script به واسطه گزینه های متفاوت دیباگ بحث کردیم، توصیه میشود لینک آموزش نحوه فعال سازی مد debug در shell script را مطالعه فرمایید. بعد از اینکه شل اسکریپت خودتان رو نوشتید اکیدا توصیه شده که syntax را در اسکریپت و قبل از اجرای آنها بررسی کنید تا خروجی آنها را مشاهده و صحت کارکرد اسکریپت را تایید کنید.
در این پست ما به استفاده از mode دیباگ به منظور بررسی ساختار (syntax) خواهیم پرداخت. ما از گزینه های متفاوت دیباگ که در پست قبلی مطرح کردیم برای اجرا کردن دیباگ اسکریپت استفاده خواهیم کرد.
همچنین توصیه میشود مطالعه کنید :
استفاده از شل اسکریپت برای اتوماتیک کردن Task ها در لینوکس
نحوه فعال کردن مد Debug شل اسکریپت در لینوکس
آموزش نحوه اجرای Trace دستورات در شل اسکریپت با استفاده از Shell Tracing
فعال کردن مد دیباگ Verbose
قبل از اینکه به موضوع اصلی این پست بپردازیم اجازه دهید توضیح مختصری روی مد verbose داشته باشیم. این mode با استفاده از آپشن دیباگ -v فعال میشود و به shell اعلام میکند که تمام خطوط در یک اسکریپت را در حالی که خوانده میشوند، نمایش دهد.
برای نمایش نحوه کارکرد آن به نمونه زیر توجه کنید که یک نمونه shell script برای convert دسته جمعی تصاویر با پسوند png به فرمت jpg میباشد.
نمونه زیر را درون یک فایل تایپ و یا کپی، پیست کنید.
سپس فایل را ذخیره کنید و با استفاده از دستور زیر به اسکریپت قابلیت اجرایی بدهید.
ما میتوانیم از اسکریپت استفاده کنیم و تمامی خطوط موجود در آن را در حالیکه توسط shell در حال خوانده شدند هستند نمایش دهیم.
فعال کردن Debugging Mode به منظور بررسی Syntax در Shell Script
به اصل مطلب برمیگردیم، با استفاده از آپشن -n میتوانیم مد بررسی syntax را enable کنیم. این آپشن شل را مجبور میکند که تمام دستورات را بخواند اما آنها را اجرا نکند و در حقیقت شل تنها ساختار مورد استفاده را امتحان و مورد تست قرار میدهد.
اگر هر گونه error ی در شل اسکریپت شما موجود باشد shell خطاها را روی ترمینال نمایش میدهد، در غیر اینصورت هیچ چیزی نمایش داده نمیشود.
ساختار فعال کردن بررسی syntax به شکل زیر انجام میشود :
به دلیل اینکه syntax در اسکریپت درست است دستور بالا هیچ خروجی ندارد. اما برای اینکه error را نیز به شما نمایش دهیم اجازه دهید کلمه "done" (که هر گونه loop ی را میبندد) حذف کنیم و ببینیم آیا خطایی دریافت میکنیم یا خیر.
نمونه زیر همان شل اسکریپت تبدیل دسته جمعی فایل های png به فرمت jpg میباشد که آنرا تغییر دادیم و در حقیقت یک bug در آن ایجاد کردیم.
فایل را ذخیره کنید و سپس آنرا در حالیکه دیباگ syntax را فعال کرده اید اجرا کنید :
از خروجی بالا میتوانیم مشاهده کنید که یک مشکل syntax ی در اسکریپت مان وجود دارد، در حقیقت کمبود یک کلمه کلیدی "done" که برای بستن لوپ (loop) استفاده میشود در فایل مشهود است و شل به دنبال آن میگردد تا فایل را خاتمه دهد و به محض اینکه آنرا (done) پیدا نکند syntax error را نمایش میدهد.
ما همچنین میتوانیم verbose mode و syntax mode را با هم ترکیب کنیم :
هم چنین ما میتوانیم بررسی syntax را تغییر اولین خط اسکریپت همانطور که در مثال بعدی میبینید فعال کنید.
مانند قبل فایل را ذخیره کنید و آنرا در حالیکه ساختار را بررسی میکند اجرا کنید :
علاوه بر این ما میتوانیم از دستور درونی شل به نام set استفاده کنیم تا مد دیباگ را در شل فعال سازیم.
در مثال زیر ما تنها به بررسی ساختار اسکریپت مان به منظور هر گونه loop میپردازیم.
یک بار دیگر فایل را ذخیره و آنرا اجرا کنید.
در نهایت باز هم عنوان میکنیم که همیشه باید از نظر ساختاری (syntactically) شل اسکریپت هایمان را بررسی کنیم تا هر گونه خطایی را قبل از اجرا کردن آن پیدا کنیم.
در آینده ای نچندان دور ما به توضیح و استفاده از مد دیباگ "Tracing" شل خواهیم پرداخت. اگر هر گونه نظر یا پیشنهادی درباره این پست دارید میتوانید با ما درمیان بگذارید.
در این پست ما به استفاده از mode دیباگ به منظور بررسی ساختار (syntax) خواهیم پرداخت. ما از گزینه های متفاوت دیباگ که در پست قبلی مطرح کردیم برای اجرا کردن دیباگ اسکریپت استفاده خواهیم کرد.
همچنین توصیه میشود مطالعه کنید :
استفاده از شل اسکریپت برای اتوماتیک کردن Task ها در لینوکس
نحوه فعال کردن مد Debug شل اسکریپت در لینوکس
آموزش نحوه اجرای Trace دستورات در شل اسکریپت با استفاده از Shell Tracing
فعال کردن مد دیباگ Verbose
قبل از اینکه به موضوع اصلی این پست بپردازیم اجازه دهید توضیح مختصری روی مد verbose داشته باشیم. این mode با استفاده از آپشن دیباگ -v فعال میشود و به shell اعلام میکند که تمام خطوط در یک اسکریپت را در حالی که خوانده میشوند، نمایش دهد.
برای نمایش نحوه کارکرد آن به نمونه زیر توجه کنید که یک نمونه shell script برای convert دسته جمعی تصاویر با پسوند png به فرمت jpg میباشد.
نمونه زیر را درون یک فایل تایپ و یا کپی، پیست کنید.
کد PHP:
#!/bin/bash
#convert
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
done
exit 0
کد PHP:
$ chmod +x script.sh
کد PHP:
$ bash -v script.sh
فعال کردن Debugging Mode به منظور بررسی Syntax در Shell Script
به اصل مطلب برمیگردیم، با استفاده از آپشن -n میتوانیم مد بررسی syntax را enable کنیم. این آپشن شل را مجبور میکند که تمام دستورات را بخواند اما آنها را اجرا نکند و در حقیقت شل تنها ساختار مورد استفاده را امتحان و مورد تست قرار میدهد.
اگر هر گونه error ی در شل اسکریپت شما موجود باشد shell خطاها را روی ترمینال نمایش میدهد، در غیر اینصورت هیچ چیزی نمایش داده نمیشود.
ساختار فعال کردن بررسی syntax به شکل زیر انجام میشود :
کد PHP:
$ bash -n script.sh
نمونه زیر همان شل اسکریپت تبدیل دسته جمعی فایل های png به فرمت jpg میباشد که آنرا تغییر دادیم و در حقیقت یک bug در آن ایجاد کردیم.
کد PHP:
#!/bin/bash
#script with a bug
#convert
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
exit 0
کد PHP:
$ bash -n script.sh
از خروجی بالا میتوانیم مشاهده کنید که یک مشکل syntax ی در اسکریپت مان وجود دارد، در حقیقت کمبود یک کلمه کلیدی "done" که برای بستن لوپ (loop) استفاده میشود در فایل مشهود است و شل به دنبال آن میگردد تا فایل را خاتمه دهد و به محض اینکه آنرا (done) پیدا نکند syntax error را نمایش میدهد.
کد PHP:
script.sh: line 11: syntax error: unexpected end of file
کد PHP:
$ bash -vn script.sh
هم چنین ما میتوانیم بررسی syntax را تغییر اولین خط اسکریپت همانطور که در مثال بعدی میبینید فعال کنید.
کد PHP:
#!/bin/bash -n
#altering the first line of a script to enable syntax checking
#convert
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
exit 0
کد PHP:
$ ./script.sh
script.sh: line 12: syntax error: unexpected end of file
در مثال زیر ما تنها به بررسی ساختار اسکریپت مان به منظور هر گونه loop میپردازیم.
کد PHP:
#!/bin/bash
#using set shell built-in command to enable debugging
#convert
#enable debugging
set -n
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
#disable debugging
set +n
exit 0
کد PHP:
$ ./script.sh
در آینده ای نچندان دور ما به توضیح و استفاده از مد دیباگ "Tracing" شل خواهیم پرداخت. اگر هر گونه نظر یا پیشنهادی درباره این پست دارید میتوانید با ما درمیان بگذارید.