(بخش دوم از آموزش shell scripts)



Quating کردن یک کاراکتر تکی

یک کاراکتر دیگر نیز برای quating استفاده می شود. این کارکتر بک اسلش است .بک اسلش به شل می گوید که کاراکنر بعدی را نادیده بگیرد .به مثال زیر توجه کنید:



behrad@debian:~$ echo "My host name is $HOSTNAME."

My host name is $HOSTNAME.



بااستفاده از بک اسلش ٬شل سمبل "$” را نادیده می گیرد و با آن مانند یک کاراکتر معمولی برخورد می کند و عمل جایگزینی متغیر HOSTNAME را انجام نمی دهد. به یک مثال کاربردی تر توجه کنید:



behrad@debian:~$ echo "My host name is "$HOSTNAME"."

My host name is "debian".



همان طور که مشاهده می کنید با استفاده از " توانستیم از دابل کوتیشن در متن خود استفاده کنیم.





- دیگر ترفندهای بک اسلش

در صورتی که شما به صفحات manpage برنامه هایی که توسط پروژه گنو نوشته شده اندنگاهی بیندازید متوجه می شوید که هر دستور از یک سری گزینه ها که با یک dash شروع می شوند به علاوه یک کاراکتر پشتیبانی می کند. علاوه بر آن از یک سری گزینه هایی با اسامی بلند تر که با دو تا dash شروع می شوند و هر ذو به یک معنی هستند .به مثال زیر توجه کنید:

ls -r

ls --reverse



به چه علت هر دو پشتیبانی می شوند؟ گزینه های تک کاراکتری برای اجرای سریعتر دستور در خط فرمان است و گزینه های چند کاراکتری برای استفاده در اسکریپت. استفاده از گزینه های بلند باعث می شود تا در صورتی که شما نیاز پیدا کنید که پس از مدتی یک اسکریپت را بررسی و اصلاح نمایید ٬با یک نگاه ٬متوجه دلیل استفاده از گزینه ها شوید. این کار شما را از مرور مجدد manpage ها بی نیاز می کند. در واقع با کمی تایپ بیشتر در زمان نوشتن اسکریپت ٬کار خود را در آینده کمتر می کنید.



شاید استفاده از گزینه های طولانی شما را به این فکر بیندازد که دستورات ممکن است بسیار طولانی شوند . شما می توانید از بک اسلش به شکل زیر برای خوانا تر شدن اسکریپت خود استفاده کنید:



ls -l

--reverse

--human-readable

--full-time



توجه داشته باشید٬ زمانی که شما از بک اسلش به این منظور استفاده می کنید نباید بعد از آن هیچ فضای خالی(space) قرار دهید ٬چرا که در این صورت شل ادامه دستور را در نظر نمی گیرد. از بک اسلش برای قرار دادن کاراکتر های خاص درون متن نیز استفاده می شود که به آنها backslash escape characters گفته می شود. در اینجا به تعدادی از آنها اشاره می کنیم:



Possible Uses

Name

Escape Character

یک خط جدید به متن اضافه کنید

خط جدید

n\

tab افقی به متن اضافه کنید

tab

t\

باعث ایجاد یک beep می شود

آژیر

a\

یک بک اسلش در متن قرار میدهد

بک اسلش

\

ارسال آن به پرینتر کاغذ را خارج می کند

formfeed

f\





استفاده از این کاراکتر ها بسیار معمول است. این ایده اولین بار در زبان C وارد شد. امروز٬ shellو C++ ,perl , python , awk, tcl و بسیاری از زبانهای برنامه نویسی دیگر از این ایده استفاده می کنند. استفاده از echo به همراه گزینه e- این امکان را به ما می دهد تا نحوه استفاده از آنها را به شما نشان دهیم:



behrad@debian:~$ echo -e "Inserting several blank linesnnn"

Inserting several blank lines



behrad@debian:~$ echo -e "Wordstseparatedtbythorizontalttabs."

Words separated by horizontal tabs.

behrad@debian:~$ echo -e "aMy computer went "beep"."

My computer went "beep".

behrad@debian:~$ echo -e "DEL C:WIN2KLEGACY_OS.EXE"

DEL C:WIN2KLEGACY_OS.EXE



- توابع شل

هر چه برنامه طولانی تر و پیچیده تر باشد ٬طراحی ٬کدنویسی و نگهداری آن مشکل تر است. بهترین کاری که در این مواقع می توان انجام داد ٬شکستن یک کار بلند به چندین قسمت کوچک تر است.

در این درس ٬ما اسکریپت یکپارچه خود را به چندین تابع می شکنیم.

برای آنکه بیشتر با این مسئله آشنا شوید اجازه دهید تا یک مثال از کارهای روزانه بزنیم(رفتن به مغازه و خرید غذا). تصور کنید که ما می خاهیم این کار را برای یک نفر از کره مریخ توضیح دهیم.



توضیحات سطح بالای (top level) ما می تواند مانند زیر باشد:

-۱ ترک خانه

-۲ رانندگی تا مغازه

-۳ پارک کردن ماشین

-۴ وارد شدن به مغاره

-۵ خرید غذا

-۶ رانندگی تا خانه

-۷ پارک ماشین

-۸ وارد شدن به خانه



ابن توضیحات شامل همه اعمال برای رفتن به مغازه می شود ٬با وجود این احتمالا مرد مریخی احتمالا به جزئیات بیشتری نیاز دارد. برای مثال پارک کردن ماشین می تواند شامل زیر مجموعه های زیرباشد :

-۱ پیدا کردن جای پارک

-۲ بردن ماشین به محل پارک

-۳ خاموش کردن موتور

-۴ کشیدن ترمز دستی

-۵ خارج شدن از ماشین

-۶ قفل کردن در ماشین



البته عمل خاموش کردن ماشین می تواند شامل مراحلی چون " خامش کردن احتراق " و " خارج کردن کلید از جایش " و یا بیشتر باشد.

این عمل یعنی مشخص کردن سطوح بالایی و سپس توسعه هر یک از آنها به صورت جزئیات و مراحل کوچکتر طراحی top-down خوانده می شود. این تکنیک به شما اجازه می دهد تا کارهای بزرگ و پیچیده را به تعدادی کار ساده تر و کوچکتر بشکنید.

همینطور که اسکریپت ما رشد می کند٬ ما از طراح یtop-down برای طراحی و کد نویسی اسکریپتمان کمک می گیریم.



اگر به اعمال سطح بالای اسکریپتمان نگاه کنیم ٬لیستس مانند زیر خواهد داشت:

-۱ باز کردن صفحه

-۲ باز کردن بخش head

-۳ نوشتن title

-۴ بستن بخش head

-۵ باز کردن بخش body

-۶ نوشتن title

-۷ نوشتن برچسب زمانی (time stamp)

-۸ بستن بخش body

-۹ بستن صفحه



تمام این اعمال را پیاده سازی کردیم ٬اما ما می خواهیم چند عمل دیگر به آن اضافه کنیم.اجازه دهید چند عمل دیگر بعد از شماره ۷ به آن اضافه کنیم:

-۷ نوشتن برچسب زمانی

-۸ نوشتن مشخصات سیستم

-۹ نوشتن زمان بالا بودن سیستم (uptime)

-۱۰ نوشتن فضای درایو

-۱۱ نوشتن فضای home

-۱۲ بستن بخش body

-۱۳ بستن صفحه



خیلس خوب می شد اگر دستوراتی بودند ٬تا می توانستیم اعمال اضافه شده را توسط آنها انجام دهیم .اگر وجود داشت می توانستیم آنها را در اسکریپت خود به صورت زیر جایگزین کنیم:



#!/bin/bash

# system_page - A script to produce a system information HTML file

##### Constants



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_



تا زمانی که این دستورات وجود ندارن ما می توانیم از توابع شل استفاده کنیم.



همانطور که در درسهای قبلی آموختید توابع شل مانند یک برنامه درون برنامه دیگر عمل می کنند و به ما اجازه می دهند تا از طراحی top-down بهره ببریم. برای اضافه کردن توابع شل به اسکریپت آنرا به صورت زیر تغییر می دهیم:



#!/bin/bash

# system_page - A script to produce an system information HTML file

##### Constants



TITLE="System Information for $HOSTNAME"

RIGHT_NOW=$(date +"%x %r %Z")

TIME_STAMP="Updated on $RIGHT_NOW by $USER"

##### Functions



function system_info

{

}

function show_uptime

{

}

function drive_space

{

}

function home_space

{

}

function show_info

{

}

##### 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” بسازیم ٬ اما هنوز تمام جرئیات کد آنرا طراحی نکرده ایم . می توانیم تا زمانی که اسکریپت در حال توسعه است و هنوز آماده نشده تنها یک دستور echo مانند زیر به آن اضافه کنیم:



 

function system_info

{

# Temporary function stub

echo "function system_info"

}



با این راه اسکریپت ما با وجودی که تابع system_info آماده نشده است ٬همچنان با موفقیت اجرا می شود . ما بعدا کد های آماده شده را به اسکریپت اضافه می کنیم.



دلیل آنکه از echo استفاده کردیم آنست که یک بازخورد از اسکریپت بگیریم ٬تا مطمئن شویم که تابع اجرا می شود. اجازه دهید ادامه دهیم ٬برای توابع جدیدمان stub بنویسیم و اسکریپت خود را قابل اجرا نگه داریم :



#!/bin/bash

# system_page - A script to produce an system information HTML file

##### Constants



TITLE="System Information for $HOSTNAME"

RIGHT_NOW=$(date +"%x %r %Z")

TIME_STAMP="Updated on $RIGHT_NOW by $USER"

##### Functions

function system_info

{

# Temporary function stub

echo "function system_info"

}



function show_uptime

{

# Temporary function stub

echo "function show_uptime"

}



function drive_space

{

# Temporary function stub

echo "function drive_space"

}



function home_space

{

# Temporary function stub

echo "function home_space"

}



function show_info

{

# Temporary function stub

echo "function show_info"

}



##### 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_



- چند کار واقعی

در این درس ما تعدادی از توابع را توسعه می دهیم و اسکریپنمان را برای تولید اطلاعات مفیذ به کار می بریم.



show_uptime

تابع show_uptime خروجی دستور uptime را نمایش می دهد .خروجی دستور uptime تعدادی اطلاعات جالب در مورد سیستم شما در اختیارتان قرار می دهد ٬که شامل مقدار زمانی که سیستم در حال کار است ٬ تعدا کاربران و آخرین system load است.



behrad@debian:~$ uptime

08:51:15 up 2:29, 3 users, load average: 0.27, 0.13, 0.03



برای قرار دادن خروجی دستور uptime در صفحه HTML ما تابع را به صورت زیر کد نویسی کردیم:



function show_uptime

{

echo "<h2>System uptime</h2>"

echo "<pre>"

uptime

echo "</pre>"

}



همانطور که می بینید خروجی این دستور یک متن شامل تگهای HTML و خروجی دستور است. زمانی که این تابع در ببدنه برنامه اصلی جایگزین شود خروجی آن قسمتی از اسکریپت می شود.



drive_space

تابع drive_space از دستور df برای تهیه گزارش از فضای استفاده شده در سیستم فایل هایی که متصلند استفاده می کند.



behrad@debian:~$ df

Filesystem 1k-blocks Used Available Use% Mounted on



/dev/hda2 509992 225772 279080 45% /

/dev/hda1 23324 1796 21288 8% /boot

/dev/hda3 15739176 1748176 13832360 12% /home

/dev/hda5 3123888 3039584 52820 99% /usr



ساختار تابع drive_space بسیار شبیه تابع show_uptime است.



function drive_space

{

echo "<h2>Filesystem space</h2>"

echo "<pre>"

df

echo "</pre>"

}





home_space

تابع home_space مقدار فضایی که هر کاربر در شاخه خانگی خود استفاده کرده استرا نمایش می دهد. این تابع خروجی را به شکل لیستی مرتب شده به صورت نزولی بر مبنای فضای استفاده شده نمایش می دهد.



function home_space

{

echo "<h2>Home directory space by user</h2>"

echo "<pre>"

echo "Bytes Directory"

du -s /home/* | sort -nr

echo "</pre>"

}





system_info

ما هنوز برای اتمام این تابع آماده نیستیم ٬پس آنرا به صورت stubbing code اصلاح می کنیم:



function system_info

{

echo "<h2>System release info</h2>"

echo "<p>Function not yet implemented</p>"

}





کنترل جریان (flow control)- قسمت اول

تا حالا اسکریپت ما تنها شامل ترتیب ثابتی از دستورات بود که از سطر اول ٬خط به خط اجرا می شد تا به آخر اسکریپت می رسید. بیشتر برنامه ها کاری بیش از این انجام می دهند. آنها تصمیم می گیرند و اعمال متفاوتی را با توجه به شرایط انجام می دهند. شل چندین دستور برای کنترل اجرای برنامه در احتیار ما قرار می دهد. آنها شامل موارد زیر هستند:



if

exit

for

while

until

case

break

continue

if

اولین دستوری که بررسی می کنیم دستور if می باشد. دستور if بسیار ساده است. if تصمیم را بر اساس یک شرط می گیرد . دستور if را می توان به سه فرم زیر استفاده کرد.

# First form



if condition ; then

commands

fi



# Second form



if condition ; then

commands

else

commands

fi



# Third form



if condition ; then

commands

elif condition

commands

fi



در حالت اول ٬اگر شرط درست باشد ٬ دستور اجرا می شود و اگر غلط کاری انجام نمی شود.

در حالت دوم ٬اگر شرط درست باشد دستورات بخش اول اجرا می شود. اگر غلط باشد دستورات بخش دوم اجرا می شود.

در فرم سوم ٬اگر شرط درست باشد دستورات بخش اول اجرا می شود. اگر شرط اول غلط و شرط دوم درست باشد ٬دستورات بخش دوم اجرا می شود٬ وا گر هر دو غلط باشد کاری انجام نمی شود.



" شرط " (condition) چیست؟

برای جواب به این سؤال باید ابتدا یک دستور پایه ای را توضیح دهیم:



Exit status

یک برنامه یونیکسی که به طو مناسب نوشته شده باشد ٬پس از آنکه فراخوانی و اجرا شد به سیستم عامل اعلام می کند کند که آیا با موفقیت اجرا شده است یا نه. به این مفهوم exit status گفته می شود. Exit status یک مقدار عددی بین "0” و "255” است. صفر نشان دهنده موفقیت آمیز بودن و بقیه مقادیر نشان دهنده عذم موفقیت هستند.

exit status دو خاصیت مهم را در اختیار ما قرار می دهد: اول آنکه می تواند برای کشف و بررسی خطا (error handling) مورد استفاده قرار بگیرد. و دوم می تواند برای ایجاد true/false استفاده شود. کار با خطا هایی که دارای مقدار هستند بسیار آسان تر است. برای مثال ٬در اسکریپتمان می خواهیم بررسی کنیم که چه سخت افزارهایی نصب شده اند ٬تا بتوانیم آنها را در گزارش خود بیاوریم. معمولا سعی می کنیم یک query با سخت افزار انجام دهیمو اگر پیغام خطایی توسط هر ابزار ارسال شد ما در آن مورد تصمیم می گیریم. با وجود این خاصیت که گفته شد اسکریپت ما توانایی پیدا می کند تا رمانی که به یک سخت افزار ٬که وجود ندارد بر می خورد ٬ آنرا نادیده بگیرد.

ما همچنین می تونیم از exit status برای تصمیمات ساده true/false استفاده کنیم. که آن را در ادامه توضیح می دهیم.





test

دستور test اغاب به همراه دستور if برای انجام تصمیم گیری true/false استفاده می شود. این دستو معمولا به دو فرم استفاده می شود:



# First form

test expression



# Second form

[ expression ]



دستور test بسیار ساده عمل می کند. در صورتی که expression درست باشد٬ test مقدار صفر را بر می گرداند و در غیر این صورت یک.

یک خصیصه بسیار خوب این دستور٬ expression هایی است که می توانید بسازید. به مثال زیر توجه کنید:



if [ -f .bash_profile ]; then

echo "You have a .bash_profile. Things are fine."

else

echo "Yikes! You have no .bash_profile!"

fi

در این مثال ما از "f .bash_profile-” استفاده کردیم. این expression بررسی می کند که آیا bash_profile. یک فایل است؟ اگر expression درست باشد٬ test با مقدار صفر (نشان دهنده true)خارج می شود و دستور if دستور بعد از کلمه then را اجرا می کند. واگر expression برابر false باشد٬ test مقدار یک را بر می گرداند و دستور if دستور بعد از else را اجرا می کند.



در زیر لیست کوچکی از شروطی که test می تواند بررسی کند را آورده ایم. از آنجایی که test یک دستور built in است ٬می توانید از دستور help test برای دیدن کل لیست استفاده کنید.





Description

Expression

True if file is a directory

d file-

True if file exists

e file-

True if file exists and is a regular file

f file-

True if file is a file readable by you

r file-

True if file is a file writable by you

w file-

True if file is a file executable by you

x file-

True if file1 is newer than (according to modification time) file2

file1 -nt file2

True if file1 is older than file2

file1 -ot file2

True if string is empty

z string-

True if string is not empty

n string-

True if string1 equals string2

string1 = string2

True if string1 does not equal string2

string1 != string2



قبل ار آنکه از مسئله بالا رد شویم ٬می خواهم چند نکته را در مورد مثال قبلی توضیح دهم.

در اولین خط اسکریپت٬ ما دستور if ٬ و در ادامه ٬دستور test را می بینیم و بعد از یک سمیکالن ٬ در آخر٬ کلمه then. من در اینجا فرم [ expression ] را برای اجرای دستور test انتخاب کردم ٬زیرا که استفاده از آن برای اغلب افراد راحت تر است.توجه داشته باشید که بعد از علامت ] و قبل از علامت [ حتما باید یک فاصله خالی (space) باشد.



سمیکالن جدا کننده دستورات است. با استفاده از آن می توانید چند دستور را در یک خط بنویسید و اجرا کنید برای مثال



behrad@debian:~$ clear;ls



صفحه نمایش را پاک می کند و بعد از آن دستور ls اجرا می شود.

من از سمیکالن استفاده می کنم تا بتوتنم کلمه then را در همان خط دستور if قرار دهم. زیرا که احساس می کنم به این شکل خواناتر است.

در خط دوم دوست قدیمی ما echo قرار دارد. در اینجا تنها نکته ای که وجود دارد٬ پله ایی نوشتن کد است. در اینجا نیز این کار تنها به منظور خوانا تر بودن کد انجام شده و شل نیازی به آن ندارد. به عبارت دیگر ما می توانیم کد را به شکلهای زیر هم بنویسیم و همان نتیجه را بگیریم:



# Alternate form


if [ -f .bash_profile ]

then

echo "You have a .bash_profile. Things are fine."

else

echo "Yikes! You have no .bash_profile!"

fi

# Another alternate form


if [ -f .bash_profile ]

then echo "You have a .bash_profile. Things are fine."

else echo "Yikes! You have no .bash_profile!"

fi



exit

برای آنکه یک نویسنده اسکریپت خوب باشیم٬ بایذ زمانی که به آخر اسکریپتمان می رسیم exit status ست کنیم. برای این کار از دستور exit استفاده می کنیم. دستور exit باعث می شود که اسکریپت در لحظه خاتمه پیدا کند و مقدار exit status را برایهمان مقداری قرار دهد که به عنوان آرگومان به آن داده ایم . برای مثال

exit 0

از اسکریپت شما خارج می شود و exit status برابر 0 (موفقیت) قرار می دهد. در حالیکه

exit 1

از اسکریپت خارج می شود و exit status را برابر 1 (عدم موفقیت) قرار می دهد.





Testing برای کاربر ریشه

مواقعی هست که شما نیاز دارید که یک اسکریپت را به خاطر دستوراتی که در آن استفاده کرده اید و آنها نیاز به سطح دسترسی ریشه را دارند٬ به وسیله کاربر ریشه اجرا منید. در صورتی که این اسکریپت را به وسیله کاربر معمولی اجرا منید با تعداد زیادی پیغام خطا مواجه می شوید.

چه کاری می توانی انجام دهیم تا در صورتی که یک کاربر معمولی خواست آنرا اجرا کند اجرای آن متوقف شود؟

دستور id می تواند به ما بگوید که کاربر حاضر کیست. زمانی که دستور را به همراه گزینه "u-” اجرا کنید خزوجی دستور شماره مشخصه (user id) کاربر حاضر خواهد بود.



behrad@debian:~$ id -u

1000

behrad@debian:~$ su

Password:

root@debian:~# id -u

0



اگر کاربر ریشه id -u رااجرا کند٬ خروجی دستور ۰ خواهد بود. این خروجی می تواند ملاک شرط ما قرار گیرد.



if [ $(id -u) = "0" ]; then

echo "superuser"

fi



در این مثال اگر خروجی دستور id -u برابر رشته "0” باشد٬ رشته "superuser” چاپ می شود.



تنها فهمیدن اینکه آیا کاربر حاضر root است یا نهمشکل ما را حل نمی کند. ما می خواهیم در صورتی که کاربر حاضر کاربر root نبود ٬اجرای اسکریپت متوقف شود. ما می توانیم برای انجام این کار از کدی مانند زیر استفاده کنیم:



if [ $(id -u) != "0" ]; then

echo "You must be the superuser to run this script" >&2

exit 1

fi



به وسیله این کد ٬در صورتی که خروجی دستور id -u برابر رشته "0” نبود ٬اسکریپت یک پیغام خطا چاپ می کند٬ خارج می شود و exit status را برابر 1 قرار می دهدتا به سیستم عامل بگوید که اجرای اسکریپت موفقیت آمیز نبوده است.



به عبارت 2&< در آخر دستور echo توجه کنید٬ این عبارت فرم دیگری از هدایت ورودی/خروجی است (I/O Redirection) . شما ممکن است در بسیاری جاها که پیغام خطایی باید نمایش داده شود ٬با آن مواجه شده باشید. در صورتی که این کار انجام نشود٬ پیغام خطا به خروجی استاندارد فرستاده می شود. با کمک این عبارت پیغام به خطای استاندارد (standard error) فرستاده می شود. زمانی که یک اسکریپت را اجرا می کنیمو خروجی استاندارد آن را درون یک فایل هدایت می کنیم٬‌می خواهیم که پیغام های خطا از خروجی های نرمال مجزا شوند. که در صورتی که به این طریق عمل کنید این اتفاق خواهد افتاد.



ما باید این اعمال را در در اول اسکریپت خود قرار دهیم تا قبل از آنکه دستوری اجرا شود ٬شرط را چک کنیم. از این ایده می توانیم در اسکریپت home_space استفاده کنیم:



function home_space

{

# Only the superuser can get this information



if [ "$(id -u)" = "0" ]; then

echo "<h2>Home directory space by user</h2>"

echo "<pre>"

echo "Bytes Directory"

du -s /home/* | sort -nr

echo "</pre>"

fi



} # end of home_space



با وجود این راه حل ٬در صورتی که یک کاربر معمولی اسکریپت را اجرا کند ٬کدهایی که مشکل ایجاد می کردند نادیده کرفته می شوند و در ضمن اسکریپت نیز اجرا می شود. خوب مشکل ما هم حل شده است.





مترجم : بهراد اسلامی فر

behrad At Giveme5 Dot ir

www.giveme5.ir