دستورات مرکب
فهرست مطالب
BASH روشهای بسیاری برای ترکیب فرمانها جهت رسیدن به هدفهایمان ارائه میکند. قبلاً برخی از آنها را در عمل دیدهایم، اما اکنون بیایید کمی بیشتر به آنها بپردازیم.
BASH ساختارهایی دارد که دستورات مرکب نامیده میشوند، عبارتی چندپهلو، که با مفاهیم متفاوتی مرتبط میباشد. ما قبلاً بعضی از دستورات مرکب ارائه شده در BASH را دیدهایم -- جملههای
علاوه براین، به توابع و مستعارها که دستورات مرکب نیستند، اما به روش مشابهی عمل میکنند، نیز خواهیم پرداخت.
در مستندات گنو: Compound Commands
پوسته های فرعی
یک پوسته فرعی مانند یک پردازش فرزند است، غیر از اینکه اطلاعات بیشتری ارث میبرد. در یک خط لوله، پوستههای فرعی به طور ضمنی برای هر فرمان ایجاد میگردند. همچنین به طور صریح نیز با به کار بردن پرانتزها در اطراف دستور، ایجاد میشوند:
$( cd /tmp|| exit1 ; date> timestamp) $ pwd/home/lhunath
موقعی که پوسته فرعی خاتمه مییابد، اثر دستور cd از بین رفته است -- ما همانجایی هستیم که از آنجا شروع کرده بودیم. همچنین، هر متغیری که در پوسته فرعی تنظیم گردیده، قابل یادآوری نیست. میتوانید پوسته فرعی را به صورت پوسته موقتی در نظر بگیرید. برای جزئیات بیشتر پوسته فرعی را ملاحظه کنید.
توجه داشته باشید که در این مثال، اگر فرمان cd ناموفق باشد، دستور exit
در مستندات گنو: Command Grouping
گروه بندی دستورات
قبلاً با این موضوع در گروه بندی جملات برخورد کردهایم، با وجود آن در ضمن این فصل تکرار میشود.
با استفاده از ابروها، دستورات را میتوان گروهبندی نمود. این تا حدودی مانند پوستههای فرعی به نظر میآید، اما اینطور نیست. دستورات گروهی مانند هر چیز دیگر در همان پوسته اجرا میشوند نه در یک شل جدید.
دستورات گروهی میتوانند برای اجرای دستورات چندگانه به کار رفته و یک تغییر مسیر منفردِ مؤثر بر تمام آنها داشته باشند:
${ echo \"Starting at$( date) \"; rsync-av . /backup ; echo \"Finishing at$( date) \"; } > backup.log 2 >& 1
یک زیر پوسته در این وضعیت زیادهروی خواهد بود، به دلیل آنکه نیازی به یک محیط موقتی نداریم. هر چند که، یک پوسته فرعی نیز کار خواهد کرد.
گروههای دستورات همچنین برای کوتاه کردن وظایف معین متداول، سودمند میباشند:
$[[ -f $ CONFIGFILE ]] || { echo \"Config file$ CONFIGFILE not found\">& 2 ; exit1 ; }
این را با روایت رسمی آن مقایسه کنید:
$if [[ ! -f $ CONFIGFILE ]] ; then > echo \"Config file$ CONFIGFILE not found\">& 2 > exit1 >fi
پوسته فرعی در اینجا کار نخوهد کرد، زیرا دستور exit
گروه دستورات، همچنین برای تنظیم متغیرها در حالتهای غیر معمول، به کار میرود:
$ echo \"cat > mouse > dog\"> inputfile ${ reada ; readb ; readc ; } < inputfile $ echo \"$ b \"mouse
خواندن دومین سطر از یک فایل، بدون یک گروه دستورات، که خواندن چندگانه دستورات read از یک توصیفگر فایل باز، بدون بازگشت هر دفعه به ابتدای فایل را مجاز میکند، بینهایت دشوار خواهد بود. با این مورد مقایسه کنید:
$ reada < inputfile $ readb < inputfile $ readc < inputfile $ echo \"$ b \"cat
ابداً آنچه ما میخواستیم، نیست!
اگر آنگونه که ما در اینجا نشان دادیم، گروه دستورات در یک سطر باشد، سپس باید یک سمیکالن قبل از بستن گروه با
${ > echo \"Starting at$( date) \" > rsync-av . /backup > echo \"Finishing at$( date) \" >} > backup.log2 >& 1
در مستندات گنو: Command Grouping