اسکریپتهای فراوانی در سیستم شما هست که از توابع به عنوان روش ساختیافته مدیریت یک سری از فرمانها استفاده میکنند. در برخی سیستمهای لینوکس، به عنوان نمونه، تعریف فایل /etc/rc.d/init.d/functions
را پیدا خواهید کرد، که در تمام اسکریپتهای init منبع شده است. با کاربرد این روش، وظایف عمومی از قبیل بررسی اینکه آیا یک پردازش اجرا میشود، شروع یا توقف یک برنامه کمکی، وغیره، فقط باید یکبار به یک روش کلی نوشته شوند . اگر همان وظیفه دوباره لازم باشد، کد بازیافت میشود.
شما میتوانید فایل /etc/functions
خودتان را ایجاد کنید که تمام توابعی که معمولاً در سیستم خود، در اسکریپتهای متفاوت استفاده میکنید، را شامل شود. فقط سطر
.
/etc/functions
را جایی در ابتدای اسکریپت قرار دهید و میتوانید توابع را بازیابی کنید.
این قسمت ممکن است در فایل /etc/profile
شما یافت شود. تابع pathmunge تعریف شده و بعد برای تنظیم path برای root و سایر کاربران استفاده میشود:
pathmunge () { if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then if [ "$2" = "after" ] ; then PATH=$PATH:$1 else PATH=$1:$PATH fi fi } # Path manipulation if [ `id -u` = 0 ]; then pathmunge /sbin pathmunge /usr/sbin pathmunge /usr/local/sbin fi pathmunge /usr/X11R6/bin after unset pathmunge
تابع میپندارد اولین شناسهاش نام مسیر باشد. اگر این نام مسیر هنوز در مسیر جاری قرار نداشته باشد، اضافه میشود. شناسه دوم تابع تعیین میکند که نام مسیر قبل یا بعد از تعریف PATH
جاری قرار گیرد.
کاربران عادی فقط /usr/X11R6/bin
به مسیرهایشان اضافه میشود، در حالیکه root یک تعداد از دایرکتوریهای اضافی شامل دستورات سیستم را میگیرد. پس از استفاده شدن، تابع unset میشود به طوری که باقی نمیماند.
مثال زیر یکی از اسکریپتهایی است که من برای تهیه پشتیبان از فایلها برای کتابهایم به کار میبرم. این از کلیدهای SSH برای فعال کردن ارتباط راه دور استفاده میکند. دو تابع تعریف شدهاند، buplinux و bupbash،هر کدام یک فایل .tar
میسازند، که بعد فشرده و به یک سرویس دهنده راه دور ارسال میشوند. پس از آن, کپی محلی پاک میشود.
یکشنبه، فقط bupbash اجرا میشود.
#/bin/bash LOGFILE="/nethome/tille/log/backupscript.log" echo "Starting backups for `date`" >> "$LOGFILE" buplinux() { DIR="/nethome/tille/xml/db/linux-basics/" TAR="Linux.tar" BZIP="$TAR.bz2" SERVER="rincewind" RDIR="/var/www/intra/tille/html/training/" cd "$DIR" tar cf "$TAR" src/*.xml src/images/*.png src/images/*.eps echo "Compressing $TAR..." >> "$LOGFILE" bzip2 "$TAR" echo "...done." >> "$LOGFILE" echo "Copying to $SERVER..." >> "$LOGFILE" scp "$BZIP" "$SERVER:$RDIR" > /dev/null 2>&1 echo "...done." >> "$LOGFILE" echo -e "Done backing up Linux course:\nSource files, PNG and EPS images.\nRubbish removed." >> "$LOGFILE" rm "$BZIP" } bupbash() { DIR="/nethome/tille/xml/db/" TAR="Bash.tar" BZIP="$TAR.bz2" FILES="bash-programming/" SERVER="rincewind" RDIR="/var/www/intra/tille/html/training/" cd "$DIR" tar cf "$TAR" "$FILES" echo "Compressing $TAR..." >> "$LOGFILE" bzip2 "$TAR" echo "...done." >> "$LOGFILE" echo "Copying to $SERVER..." >> "$LOGFILE" scp "$BZIP" "$SERVER:$RDIR" > /dev/null 2>&1 echo "...done." >> "$LOGFILE" echo -e "Done backing up Bash course:\n$FILES\nRubbish removed." >> "$LOGFILE" rm "$BZIP" } DAY=`date +%w` if [ "$DAY" -lt "2" ]; then echo "It is `date +%A`, only backing up Bash course." >> "$LOGFILE" bupbash else buplinux bupbash fi echo -e "Remote backup `date` SUCCESS\n----------" >> "$LOGFILE"
این اسکریپت از cron اجرا میشود، یعنی بدون محاوره با کاربر، بنابراین ما خروجی استاندارد خطای فرمان scp را به /dev/null
تغییر مسیر میدهیم.
ممکن است استدلال شود که تمام مراحل میتواند در یک دستور از این قبیل ترکیب گردد:
tar
c
dir_to_backup/
| bzip2 | ssh server
"cat > backup.tar.bz2
"
به هرحال اگر شما به نتایج میانی که میتواند شکست اسکریپت را پوشش دهد علاقمند هستید، این آنچه شما میخواهید نمیباشد.
عبارت
command &>
file
معادل است با
command >
file
2>&1