خط فرمان لینوکس

ترجمه فارسی LinuxCommand.org

خط فرمان لینوکس

ترجمه فارسی LinuxCommand.org

توابع پوسته

توابع پوسته

همچنانکه برنامه‌ها بزرگتر و پیچیده‌تر می‌گردند، برای طراحی، کدنویسی، و پشتیبانی دشوارتر می‌شوند. همانند با هر جد و جهد بزرگ، بیشتر اوقات تفکیک یک وظیفه بزرگ به یک گروه از وظایف کوچکتر، سودمند است.

در این درس، ما تفکیک اسکریپت یکپارچه خود به یک تعداد توابع جداگانه را آغاز خواهیم نمود.

برای آشنا شدن با این اندیشه، بیایید شرح یک وظیفه روزانه را در نظر بگیریم -- رفتن به فروشگاه برای خرید غذا. فرض کنید ما می‌خواستیم وظیفه را برای مردی از مریخ تشریح کنیم.

اولین تشریح سطح بالای ما شاید چیزی مانند این به نظر بیاید:

  1. ترک کردن خانه
  2. راندن به طرف فروشگاه
  3. پارک کردن ماشین
  4. وارد شدن به فروشگاه
  5. خریداری غذا
  6. راندن به طرف خانه
  7. پارک کردن ماشین
  8. ورود به خانه

این توضیحات پردازش کلی رفتن به فروشگاه را پوشش می‌دهد، اما مردی از مریخ احتمالاً به جزییات اضافی نیاز خواهد داشت. برای مثال، وظیفه فرعی «پارک ماشین» می‌توانست به صورت زیر تشریح گردد:

  1. یافتن مکان پارک
  2. راندن ماشین به این مکان
  3. خاموش کردن موتور
  4. کشیدن ترمز دستی
  5. خروج از ماشین
  6. قفل کردن ماشین

البته وظیفه «خاموش کردن موتور» دارای چند مرحله از قبیل «بستن سوییچ» و «بیرون آوردن سوییچ» و مانند آن است.

این پردازش شناسایی مراحل سطح بالا و گسترش افزایشی جنبه‌های جزیی آن مراحل، طراحی بالا به پایین نامیده می‌شود. این اسلوب، تجزیه وظایف پیچیده بزرگ به وظایف کوچک و ساده بسیار را برای شما میسر می‌سازد.

همچنانکه اسکریپت ما به رشد ادامه می‌دهد، ما از طراحی بالا به پایین برای کمک به خود جهت طراحی و کدنویسی اسکریپت‌مان استفاده می‌کنیم.

اگر به وظایف سطح بالای اسکریپت خود نگاه کنیم، لیست پایین را تشخیص می‌دهیم:

  1. باز کردن صفحه
  2. باز کردن بخش head
  3. نوشتن عنوان
  4. بستن بخش head
  5. باز کردن بخش body
  6. نوشتن عنوان
  7. نوشتن نشانه زمان
  8. بستن بخش body
  9. بستن صفحه

تمام این وظایف اجرا می‌شوند، اما می‌خواهیم وظایف دیگری اضافه کنیم. اجاز ه بدهید چند وظیفه اضافی بعد از وظیفه شماره ۷ درج کنیم:

  1. نوشتن نشانه زمان
  2. نوشتن اطلاعات نگارش سیستم
  3. نوشتن مدت زمان روشن بودن سیستم
  4. نوشتن فضای دیسک
  5. نوشتن فضای دایرکتوری خانگی
  6. بستن بخش body
  7. بستن صفحه

خیلی خوب بود اگر فرمانهایی وجود داشتند که این وظایف را انجام می‌دادند، ما می‌توانستیم جایگزینی فرمان را برای قرار دادن آنها در اسکریپت‌مان به این شکل به کار ببریم:

#!/bin/bash

# sysinfo_page - اطلاعات سیستم HTML اسکریپتی برای تولید یک فایل‎ ‎

##### ثابت‌ها‎

TITLE="System Information for $HOSTNAME"
RIGHT_NOW=$(date +"%x %r %Z")
TIME_STAMP="Updated on $RIGHT_NOW by $USER"

##### Main

cat <<- _EOF_
  <html>
  <head>
      <title>$TITLE</title>
  </head>

  <body>
      <h1>$TITLE</h1>
      <p>$TIME_STAMP</p>
      $(system_info)
      $(show_uptime)
      $(drive_space)
      $(home_space)
  </body>
  </html>
_EOF_ 

اگر چه فرمانهایی وجود ندارند که به طور دقیق آنچه را ما نیاز داریم انجام بدهند، ما می‌توانیم آنها را با کاربرد توابع پوسته ایجاد کنیم.

به طوریکه در درس دوم آموختیم، توابع پوسته همچون «برنامه‌های کوچک در درون برنامه‌ها» عمل می‌کنند و پیروی از اصول طراحی بالا به پایین را برای ما میسر می‌سازند. برای افزودن توایع به اسکریپت‌مان، آن را به این صورت تغییر می‌دهیم:

#!/bin/bash

# sysinfo_page - اطلاعات سیستم HTML اسکریپتی برای تولید یک فایل‎ 

##### ثابت‌ها‎

TITLE="System Information for $HOSTNAME"
RIGHT_NOW=$(date +"%x %r %Z")
TIME_STAMP="Updated on $RIGHT_NOW by $USER"

##### توابع‎

system_info()
{

}


show_uptime()
{

}


drive_space()
{

}


home_space()
{

}

##### Main

cat <<- _EOF_
  <html>
  <head>
      <title>$TITLE</title>
  </head>

  <body>
      <h1>$TITLE</h1>
      <p>$TIME_STAMP</p>
      $(system_info)
      $(show_uptime)
      $(drive_space)
      $(home_space)
  </body>
  </html>
_EOF_ 

یک زوج نکته مهم در باره توابع: نخست، آنها باید قبل از آنکه شما سعی در استفاده از آنها بنمایید، پدیدار شوند. دوم، بدنه تابع (قسمتی از تابع مابین کاراکترهای ‎{‎ و ‎}‎) حداقل باید شامل یک فرمان معتبر باشد. اسکریپت به طوریکه نوشته شده، بدون خطا اجرا نخواهد گردید، زیرا بدنه تابع‌ها خالی هستند. راه آسان برای تعمیر این مورد، قرار دادن یک جمله return در بدنه هر تابع است. بعد از آنکه این را انجام بدهید، اسکریپت دوباره به طور موفقیت‌آمیز اجرا می‌گردد.

اسکریپت‌هایتان را آماده کار نگهدارید

موقعی که یک برنامه را توسعه می‌دهید، بیشتر اوقات اضافه کردن یک مقدار اندک کد، اجرای اسکریپت، اضافه کردن مقدار دیگری کد، اجرای اسکریپت، و به همین منوال، شیوه مناسبی است. این روش، در صورتیکه شما در کُدتان اشتباه وارد کنید، یافتن و تصحیح آن را آسانتر خواهد نمود.

همچنانکه شما توابع را به اسکریپت خود اضافه می‌کنید، می‌توانید اسلوبی را که stubbing نامیده می‌شود برای کمک به مراقبت از منطق توسعه اسکریپت خود به کار ببرید. Stubbing به این صورت عمل می‌کند: تصور کنید که ما می‌خواهیم تابعی به نام ‎"system_info"‎ ایجاد کنیم اما هنوز تمام جزییات کُد آن را معین نکرده‌ایم. به جای معطل کردن پیشرفت اسکریپت تا زمانی که ما system_info را تمام کرده باشیم، فقط یک فرمان echo به این صورت اضافه می‌کنیم:

system_info()
{
    # Temporary function stub
    echo "function system_info"
} 

به این طریق، اسکریپت ما بازهم به طور موفق اجرا خواهد گردید، ولواینکه ما هنوز دارای یک تابع تکمیل شده system_info نیستیم. ما در آینده کد موقت stubbing را با نگارش کامل کارگر تعویض خواهیم نمود.

علت استفاده ما از یک فرمان echo آن است که ما واکنشی از اسکریپت دریافت می‌کنیم که بیانگر اجرا شدن توابع است.

بیایید پیش برویم و برای اسکریپت‌مان stubهایی بنویسیم و اسکریپت را قابل اجرا نگاه داریم.

#!/bin/bash

# sysinfo_page - اطلاعات سیستم HTML اسکریپتی برای تولید یک فایل‎ 

##### ثابت‌ها‎

TITLE="System Information for $HOSTNAME"
RIGHT_NOW=$(date +"%x %r %Z")
TIME_STAMP="Updated on $RIGHT_NOW by $USER"

##### توابع‎

system_info()
{
    # موقت stub تابع‎
    echo "function system_info"
}


show_uptime()
{
    # موقت stub تابع‎
    echo "function show_uptime"
}


drive_space()
{
    # Temporary function stub
    echo "function drive_space"
}


home_space()
{
    # موقت stub تابع‎
    echo "function home_space"
}


##### بخش اصلی‎

cat <<- _EOF_
  <html>
  <head>
      <title>$TITLE</title>
  </head>

  <body>
      <h1>$TITLE</h1>
      <p>$TIME_STAMP</p>
      $(system_info)
      $(show_uptime)
      $(drive_space)
      $(home_space)
  </body>
  </html>
_EOF_