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

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

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

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

Heredocs و Herestrings

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


4.3. Heredocها و Herestringها

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

    $ grep proud <<END
    > I am a proud sentence.
    > END
    I am a proud sentence.

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

در یک Heredoc، کلمه‌ای برای ایفای نقش نگهبان انتخاب می‌کنیم. هر کلمه‌ای می‌تواند باشد، ما از END در این مثال استفاده کرده‌ایم. کلمه‌ای انتخاب کنید، که درمجموعه داده‌ای شما ظاهر نمی‌شود. تمام سطرهایی که پس از اولین نمونه نگهبان تا رسیدن به دومین نمونه آمده‌اند، برای دستور stdin می‌شوند. دومین نمونه نگهبان، باید خودش یک سطر کامل باشد.

چند مورد متمایز برای Heredocها وجود دارد. به طور معمول، نمی‌توانید آنها را دندانه‌دار کنید، همه فاصله‌هایی که در اینجا برای دندانه‌دار کردن اسکریپت به کار ببرید در stdin ظاهر خواهند شد. رشته پایان دهنده(در مثال ما END) باید در ابتدای سطر باشد.

    echo "Let's test abc:"
    if [[ abc = a* ]]; then
        cat <<END
            abc seems to start with an a!
    END
    fi

چنین نتیجه خواهد داد:

    Let's test abc:
            abc seems to start with an a!

می‌توانید با حذف موقتی توگذاری برای سطرهای Heredocهای خود، از این مطلب اجتناب کنید. به هر حال، موجب بدشکل شدن تورفتگی شکیل و زیبای شما می‌گردد. یک جایگزین وجود دارد. اگر از ‎<<-END‎ به جای ‎<<END به عنوان عملگر Heredoc خود استفاده کنید، BASH همه کاراکترهای tab در ابتدای هر سطر از محتوای Heredoc شما را قبل از ارسال به دستور حذف می‌کند. به این ترتیب بازهم می‌توانید از tabها (اما از فاصله خیر) برای توگذاری محتوای Heredoc خود با بقیه کد استفاده کنید. آن tabها برای فرمانی که Heredoc شما را دریافت می‌کند، ارسال نخواهند شد. همچنین می‌توانید tabها را برای توگذاری رشته نگهبان هم به کار ببرید.

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

    $ cat <<'XYZ'
    > My home directory is $HOME
    > XYZ
    My home directory is $HOME

رایج‌ترین کاربرد Heredocها، در ارائه مستندات به کاربر است:

    usage() {
    cat <<EOF
    usage: foobar [-x] [-v] [-z] [file ...]
    A short explanation of the operation goes here.
    It might be a few lines long, but shouldn't be excessive.
    EOF
    }

حالا اجازه بدهید Herestring خیلی مشابه اما فشرده‌تر را آزمایش کنیم:

    $ grep proud <<<"I am a proud sentence"
    I am a proud sentence.

این‌دفعه، stdin مستقیماً اطلاعاتش را از رشته‌ای که پس از عملگر ‎ <<<‎ قرار داده‌اید، می‌خواند. این برای ارسال اطلاعات داخل متغیرها، به پردازش‌ها خیلی مناسب است:

    $ grep proud <<<"$USER sits proudly on his throne in $HOSTNAME."
    lhunath sits proudly on his throne in Lyndir.

Herestringها کوتاه‌تر، کمتر مزاحم، و به طور کلی مناسب‌تر از Heredocهای حجیم همتای خود می‌باشند. گرچه آنها قابل حمل به پوسته Bourne نیستند.

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

    $ echo 'Wrap this silly sentence.' | fmt -t -w 20
    Wrap this silly
       sentence.
    $ fmt -t -w 20 <<< 'Wrap this silly sentence.'
    Wrap this silly
       sentence.


  • تکرار مفید:
    heredocهای بلند به طور معمول ایده نامناسبی هستند، زیرا اسکریپت‌ها باید محتوی منطق باشند، نه داده‌ها. اگر اسکریپت به سند حجیمی نیاز دارد، باید آن را در یک فایل جداگانه با اسکریپت همراه کنید. با این وجود Herestringها، اغلب کاملاً سودمند هستند بویژه برای ارسال محتوای یک متغیر(به جای فایلها) به فیلترهایی مانند grep یا sed.



ادامه دارد...

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