آموزش‌های خط فرمانی

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

آموزش‌های خط فرمانی

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

دستورات مرکب

فصل هشتم


دستورات مرکب

BASH روشهای بسیاری برای ترکیب فرمانها جهت رسیدن به هدفهایمان ارائه می‌کند. قبلاً برخی از آنها را در عمل دیده‌ایم، اما اکنون بیایید کمی بیشتر به آنها بپردازیم.

BASH ساختارهایی دارد که دستورات مرکب نامیده می‌شوند، عبارتی چندپهلو، که با مفاهیم متفاوتی مرتبط می‌باشد. ما قبلاً بعضی از دستورات مرکب ارائه شده در BASH را دیده‌ایم -- جمله‌های if و حلقه‌های for و حلقه‌های while و کلمه‌کلیدیهای ‎ [[‎ و case و select. دوباره آن مطالب را در اینجا تکرار نخواهیم نمود. به جای آن، دستورات مرکب دیگری را که هنوز ندیده‌ایم، بررسی خواهیم کرد: پوسته‌های فرعی، گروه‌بندی دستورات، و ارزیابی محاسباتی.

علاوه براین، به توابع و مستعارها که دستورات مرکب نیستند، اما به روش مشابهی عمل می‌کنند، نیز خواهیم پرداخت.



پوسته های فرعی

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

    $ (cd /tmp || exit 1; date > timestamp)
    $ pwd
    /home/lhunath

موقعی که پوسته فرعی خاتمه می‌یابد، اثر دستور cd از بین رفته است -- ما همانجایی هستیم که از آنجا شروع کرده بودیم. همچنین، هر متغیری که در پوسته فرعی تنظیم گردیده، قابل یادآوری نیست. می‌توانید پوسته فرعی را به صورت پوسته موقتی در نظر بگیرید. برای جزئیات بیشتر پوسته فرعی را ملاحظه کنید.

توجه داشته باشید که در این مثال، اگر فرمان cd ناموفق باشد، دستور exit 1 به پوسته فرعی خاتمه می‌دهد، اما به شل محاوره‌ای ما خیر. به طوری که می‌توانید حدس بزنید، این مورد در اسکریپت‌های حقیقی کاملاً سودمند است.



گروه بندی دستورات

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

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

دستورات گروهی می‌توانند برای اجرای دستورات چندگانه به کار رفته و یک تغییر مسیر منفردِ مؤثر بر تمام آنها داشته باشند:

    $ { echo "Starting at $(date)"; rsync -av . /backup; echo "Finishing at $(date)"; } > backup.log 2>&1

یک زیر پوسته در این وضعیت زیاده‌روی خواهد بود، به دلیل آنکه نیازی به یک محیط موقتی نداریم. هر چند که، یک پوسته فرعی نیز کار خواهد کرد.

گروه‌های دستورات همچنین برای کوتاه کردن وظایف معین متداول، سودمند می‌باشند:

    $ [[ -f $CONFIGFILE ]] || { echo "Config file $CONFIGFILE not found" >&2; exit 1; }

این را با روایت رسمی آن مقایسه کنید:

    $ if [[ ! -f $CONFIGFILE ]]; then
    > echo "Config file $CONFIGFILE not found" >&2
    > exit 1
    > fi

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

گروه دستورات، همچنین برای تنظیم متغیرها در حالت‌های غیر معمول، به کار می‌رود:

    $ echo "cat
    > mouse
    > dog" > inputfile
    $ { read a; read b; read c; } < inputfile
    $ echo "$b"
    mouse

خواندن دومین سطر از یک فایل، بدون یک گروه دستورات، که خواندن چندگانه دستورات read از یک توصیف‌گر فایل باز، بدون بازگشت هر دفعه به ابتدای فایل را مجاز می‌کند، بینهایت دشوار خواهد بود. با این مورد مقایسه کنید:

    $ read a < inputfile
    $ read b < inputfile
    $ read c < inputfile
    $ echo "$b"
    cat

ابداً آنچه ما می‌خواستیم، نیست!

اگر آنگونه که ما در اینجا نشان دادیم، گروه دستورات در یک سطر باشد، سپس باید یک سمی‌کالن قبل از بستن گروه با ‎ }‎ قرار داده شود، در غیر اینصورت، BASH گمان خواهد نمود ‎}‎ یک شناسه برای آخرین دستور گروه است. اگر گروه دستورات در چندین سطر گسترده شده باشند، آنوقت سمی‌کالن می‌تواند با کاراکتر سطر جدید جایگزین شود:

    $ {
    >  echo "Starting at $(date)"
    >  rsync -av . /backup
    >  echo "Finishing at $(date)"
    > } > backup.log 2>&1



ادامه دارد...
نظرات 0 + ارسال نظر
ایمیل شما بعد از ثبت نمایش داده نخواهد شد