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

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

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

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

اسکریپت‌ها

ادامه یادداشت قبلی



اسکریپت ها

یک اسکریپت اساساً یک سلسله دستورات در داخل یک فایل است. BASH فایل را می‌خواند و دستورات را به ترتیب پردازش می‌کند. فقط وقتی به دستور بعدی می‌رود که اجرای دستور فعلی به پایان رسیده باشد، مگر اینکه دستور جاری به طور غیر همزمان اجرا گردیده باشد( در پس‌زمینه ). در مورد حالت اخیر خیلی نگران نباشید، در آینده بیشتر در باره آن خواهید آموخت.

در واقع هر مثالی که در این راهنما ملاحظه می‌کنید، دقیقاً می‌تواند به همان خوبی خط‌فرمان در اسکریپت‌ها به کار برده شود.

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

    #!/usr/bin/env bash

این سرآیند اطمینان ایجاد می‌کند که هرگاه اسکریپت اجرا شود، BASH به عنوان مفسر آن به کار خواهد رفت. ( روشهای معتبر دیگری نیز برای انجام این امر وجود دارد.) کاراکترهای !# باید در ابتدایی‌ترین نقطه فایل، بدون هر گونه فاصله یا سطری قبل از آنها قرار گیرند. دستورات اسکریپت شما همگی در سطرهای زیر این سطر ظاهر می‌شوند.

لطفاً با مثال‌های موجود در اینترنب که از ‎ /bin/sh‎ به عنوان مفسر استفاده می‌کنند فریب نخورید. sh همان bash نیست. هرچند که، دستور زبان sh و bash خیلی همسان به نظر برسند، و ولواینکه اکثر اسکریپت‌های bash در پوسته sh اجرا خواهند شد، مقدار زیادی از مثال‌های این راهنما فقط برای bash تهیه شده‌اند و در sh در می‌مانند و یا رفتار غیر منتظره‌ای خواهند داشت.

همچنین، خواهشمند است از دادن پسوند گمراه کننده ‎ .sh‎ به اسکریپت‌هایتان خودداری نمایید. چون مقصود را برآورده نمی‌کند و کاملاً گمراه کننده است(چون قرار است اسکریپت bash باشد، نه یک اسکریپت sh ).

و در ضمن اگر از Windows برای نوشتن اسکریپت‌هایتان استفاده می‌کنید، در هرحال از کاربرد Notepad برای نوشتن اسکریپت اجتناب نمایید. Microsoft Notepad فقط می‌تواند فایل‌های با انتهای سطر به روش DOS ایجاد نماید. یعنی هر سطری که در notepad ایجاد می‌کنید با دو کاراکتر خاتمه می‌یابد: یک کاراکتر رفتن سر سطر و یک کاراکتر سطرجدید. BASH فقط سطرهایی که به یک کاراکتر سطرجدید خاتمه می‌یابند را می‌خواند. در نتیجه، کاراکتر رفتن سرسطرCarriage Return وقتی که نمی‌دانید آن‌جا هست باعث دردسر باور نکردنی شما خواهد شد( پیغام خطاهای خیلی مرموز). در هر حالت ازویرایشگر محبوبی مانند Vimو Emacsو kate و GEdit و GVIM یا xemacs استفاده کنید. اگر چنین نکنید، بعد قبل از اجرای اسکریپت لازم است تمام کاراکترهای CR( رفتن سرسطر) را پاک کنید.

وقتی که اسکریپت شما آماده شد، می‌توانید آن را به صورت زیر اجرا کنید:

    $ bash myscript

در این مثال، ما BASH را اجرا کرده‌ و به او می‌گوییم اسکریپت ما را بخواند، سطر ‎#!‎ فقط یک توضیح است. BASH به هیچ وجه کاری با آن نمی‌کند.

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

    $ chmod +x myscript
    $ ./myscript

موقعی که اسکریپت به این روش اجرا می‌شود، سطر !# به سیستم عامل (OS) می‌گوید، که از چه مفسری استفاده کند. سیستم عامل ‎ /usr/bin/env‎ را برای اجرای bash به کار می‌برد، و آن هم اسکریپت ما را می‌خواند. BASH خودش از سطر سرآیند # چشم‌پوشی می‌کند.

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

    $ mkdir -p "$HOME/bin"
    $ echo 'PATH="$HOME/bin:$PATH"' >> "$HOME/.bashrc"
    $ exec bash

دستور اول، دایرکتوری با نام bin را در دایرکتوری خانگی شما ایجاد می‌کند. یک سنت است که دایرکتوری‌های شامل دستورات bin نامیده شوند، حتی وقتی‌که آن دستورات اسکریپت هستند نه برنامه‌های ترجمه شده به زبان ماشین ("باینری"). با دستور دوم یک سطر به فایل ‎ .bashrc‎ شما اضافه می‌شود، که دایرکتوری ایجاد شده را به ابتدای متغیر PATH اضافه می‌کند. حالا هر اجرای جدیدی از BASH برای یافتن اسکریپت‌های اجرایی، دایرکتوری bin شما را بررسی می‌کند. سرانجام، سطر سوم اجرای فعلی BASH ما را با یک نمونه جدید تعویض می‌کند، که فایل ‎ .bashrc‎ جدید را می‌خواند.

تغییرات در DotFiles (از قبیل ‎ .bashrc‎) هرگز بلافاصله تأثیر نمی‌کنند.باید برخی اقدام‌ها را برای حواندن مجدد فایل انجام دهید. در مثال فوق، از ‎ exec bash‎ برای تعویض پوسته در حال اجرا استفاده نمودیم. اگر خواسته باشید، می‌توانید ترمینال باز را بسته وترمینال جدیدی باز کنید. در این حالت BASH دوباره با خواندن فایل ‎ .bashrc‎( و احتمالاً سایر فایل‌ها ) خودش را مقدار دهی مجدد می‌کند. یا، می‌توانید فقط دستور ذکر شده را در خط‌فرمان به کار ببرید ‎ (PATH="$HOME/bin:$PATH")‎ و یا فایل ‎ .bashrc‎ به طور دستی در پوسته جاری با استفاده از ‎source "$HOME/.bashrc"‎ اجرا نمایید.

در هر حال، اکنون می‌توانیم اسکریپت خودمان را در دایرکتوری bin خود قرار داده و به صورت یک دستور معمولی اجرایش کنیم( حالا دیگر احتیاجی نیست که در ابتدای نام اسکریپت بخش ‎ ./‎ را مانند مثال قبلی اضافه کنیم):

    $ mv myscript "$HOME/bin" 
    $ myscript


  • نکته:
    وقتی شما در سرآیند اسکریپت نوع مفسر را تعیین می‌کنید، همچنین می‌توانید زمان کوتاهی را برای شرح دادن عملکرد اسکریپت و شناسه‌های مورد نیاز آن صرف کنید:

    
        #!/usr/bin/env bash
        #
        #   شناسه ها  نام اسکریپت  ‎
        #
        # .توضیح کوتاهی در تشریح هدف اسکریپت
        #
        # Copyright [date], [name]


  • نکته:
    می‌توانید سرآیند را با یک کلمه از شناسه‌های اختیاری که می‌خواهید به مفسر ارسال کنید به کار ببرید. به عنوان مثال، شناسه‌های زیر اشکالزدایی تفصیلی را فعال می‌کنند:

        #!/bin/bash -xv
  • لیکن دانستن آنکه Bash کجا نصب گردیده، لازم است، و همیشه هم در ‎ /bin‎ نیست. متأسفانه نمی‌توانید از این یکی استفاده کنید:

        #!/usr/bin/env bash -xv
  • به علت آنکه برای آن، دو کلمه در سرآیند لازم است. یونیکس آن را اجازه نمی‌دهد.می‌توانید به جای آن این‌طور بنویسید:

        #!/usr/bin/env bash
        set -xv
  • برای جزئیات بیشتر بخش اشکال‌زدایی را ملاحظه کنید.


  • سرآیند: سرآیند یک اسکریپت برنامه کاربردی که به عنوان مفسر عمل خواهد نمود، را تعیین می‌کند( ماننذ bash و sh و perl و ...). به طور مصطلح یک shebang نیز نامیده می‌شود-- یک عبارت عامیانه که از ترکیب hash (#) و bang(!) می‌آید. شاید ببینید که کلمه shebang خیلی بیشتر از header استفاده می‌شود، به‌ویژه چون سرآیند چند معنی دیگر در زمینه‌های متفاوت دارد، حال آنکه shebang فقط یک معنی دارد.



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