وقتی امور مطابق طرح پیش نمیرود، باید علت واقعی شکست طرح را تعیین کنید. Bash ویژگی های وسیعی برای اشکالزدایی فراهم نموده است. معمولترین آنها، شروع زیرپوسنه با گزینه -x
میباشد، که تمام اسکریپت را در وضعیت اشکالیابی اجرا میکند. هر سطر از دستورات به اضافه شناسههایش، بعد از آن که دستورات بسط داده شدند، اما قبل از آن که اجرا بشوند، در خروجی استاندارد چاپ میشوند.
این اسکریپت commented-script1.sh
است که در وضعیت اشکالیابی اجرا گردیده. دوباره توجه داشته باشید که توضیحات در خروجی اسکریپ مشاهده نمیشوند.
willy:~/scripts>
bash-x
script1.sh
+ clear + echo 'The script starts now.' The script starts now. + echo 'Hi, willy!' Hi, willy! + echo + echo 'I will now fetch you a list of connected users:' I will now fetch you a list of connected users: + echo + w 4:50pm up 18 days, 6:49, 4 users, load average: 0.58, 0.62, 0.40 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty2 - Sat 2pm 5:36m 0.24s 0.05s -bash willy :0 - Sat 2pm ? 0.00s ? - willy pts/3 - Sat 2pm 43:13 36.82s 36.82s BitchX willy ir willy pts/2 - Sat 2pm 43:13 0.13s 0.06s /usr/bin/screen + echo + echo 'I'\''m setting two variables now.' I'm setting two variables now. + COLOUR=black + VALUE=9 + echo 'This is a string: ' This is a string: + echo 'And this is a number: ' And this is a number: + echo + echo 'I'\''m giving you back your prompt now.' I'm giving you back your prompt now. + echo
اکنون یک اشکالزدای تکامل یافته برای Bash در آدرس sourceforge در دسترس میباشد. این ویژگیهای اشکالزدایی در اکثر نگارشهای مدرن Bash پس از نسخه ۳ معتبر است .
بااستفاده از دستور داخلی set در Bash میتوانید، قسمتهایی از اسکریپت را که از کارکرد بدون اشکال آنها اطمینان دارید، در وضعیت عادی اجرا کنید، وفقط اطلاعات اشکالیابی منطقه دردسر دهنده را نمایش دهید. فرض کنید مطمئن نیستیم فرمان w در مثال commented-script1.sh
،چه کار انجام خواهد داد، در آن صورت میتوانیم آنرا در اسکریپت اینطور محصور کنیم:
set -x # activate debugging from here w set +x # stop debugging from here
سپس خروجی به این شکل خواهد بود:
willy: ~/scripts>
script1.sh The script starts now. Hi, willy! I will now fetch you a list of connected users: + w 5:00pm up 18 days, 7:00, 4 users, load average: 0.79, 0.39, 0.33 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty2 - Sat 2pm 5:47m 0.24s 0.05s -bash willy :0 - Sat 2pm ? 0.00s ? - willy pts/3 - Sat 2pm 54:02 36.88s 36.88s BitchX willyke willy pts/2 - Sat 2pm 54:02 0.13s 0.06s /usr/bin/screen + set +x I'm setting two variables now. This is a string: And this is a number: I'm giving you back your prompt now.willy: ~/scripts>
میتوانید در طول همان اسکریپت هر چند بار که بخواهید وضعیت اشکالیابی را روشن و خاموش کنید.
جدول زیر خلاصهای از سایر گزینههای سودمند Bash میباشد:
جدول 2.1. خلاصه از گزینههای اشکالیابی
نماد کوتاه | نماد بلند | نتیجه |
---|---|---|
set -f | set -o noglob | ایجاد نام فایل با استفاده از فوق کاراکتر ها(globbing) غیر فعال میشود . |
set -v | set -o verbose | سطرهای ورودی شل را هنگامیکه خوانده میشوند، چاپ میکند. |
set -x | set -o xtrace | هر سطر را قبل از اجرا چاپ میکند. |
خط تیره برای فعال کردن گزینه شل استفاده شده است و علامت بعلاوه برای غیر فعال کردن آن. سر درگم نشوید!
در مثال زیر، این گزینهها را در خط فرمان نمایش دادهایم:
willy:~/scripts>
set-v
willy:~/scripts>
ls ls commented-scripts.sh script1.shwilly:~/scripts>
set+v
set +vwilly:~/scripts>
ls*
commented-scripts.sh script1.shwilly:~/scripts>
set-f
willy:~/scripts>
ls*
ls: *: No such file or directorywilly:~/scripts>
touch*
willy:~/scripts>
ls * commented-scripts.sh script1.shwilly:~/scripts>
rm*
willy:~/scripts>
ls commented-scripts.sh script1.sh
به طریق دیگر، این وضعیتهامیتوانند در خود اسکریپت، با افزودن گزینه مطلوب به سطر اول اعلام شل، تعیین شوند. گزینه ها مانند حالت معمول در خط فرمان یونیکس میتوانند ترکیب بشوند:
#!/bin/bash
-xv
وقتی که اشکالی در قسمتی از اسکریپت مییابید، میتوانید دستور echo را قبل از هر فرمانی که از آن مطمئن نیستید، اضافه کنید، برای اینکه،به طور دقیق خواهید دید که امور، کجا وچرا کار نمیکنند. در اسکریپت نمونه commented-script1.sh
میتواند به این شکل انجام شود:
echo "debug message: now attempting to start w command"; w
در اسکریپتهای پیشرفتهتر دستور echo میتواند برای نمایش محتوای متغیرها درمراحل متفاوت در اسکریپت، به طوریکه نقصها شناخته شوند، درج شود:
echo "Variable VARNAME is now set to $VARNAME."