منبع اصلی نوشتار زیر در این لینک قرار دارد

سایر عملگرها

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


راهنمای آموزشی  BashGuide   مؤلف  Lhunath

6. عملگرهای متفرقه

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

6.1. جایگزینی پردازش

پسرعموی لوله، عملگر جایگزینی پردازش است، که به دو شکل ظاهر می‌گردد: ‎<()‎ و ‎>()‎. این روش مناسبی برای به کار بردن لوله‌های با نام، بدون لزوم ایجاد فایلهای موقتی می‌باشد. هنگامی که تصور می‌کنید برای انجام مواردی نیاز به فایل موقتی دارید، ممکن است جایگزینی پردازش روش بهتری برای انجام آنها باشد.

کاری که انجام می‌دهد، اساساً اجرای دستور داخل پرانتزها می‌باشد. با عملگر ‎ <()‎ ، خروجی دستور در یک لوله با نام(یا چیزی مشابه آن) که توسط bash ایجاد شده است، قرار داده می‌شود. خود عملگر در دستور شما با نام آن فایل تعویض می‌گردد. پس از اینکه دستور به پایان رسید، فایل پاک می‌شود.

در اینجا چگونگی انجام آن را در عمل می‌بینیم: موقعیتی را در نظر بگیرید که می‌خواهید تفاوت میان خروجی دو دستور را ببینید. به طور معمول، باید دو خروجی را در دو فایل قرار بدهید و با برنامه diff آنها را مقایسه کنید:

    $ head -n 1 .dictionary > file1
    $ tail -n 1 .dictionary > file2
    $ diff -y file1 file2
    Aachen                                                  | zymurgy
    $ rm file1 file2

می‌توانیم با به کاربردن عملگر جایگزینی پردازش، تمام آن را در یک سطر انجام بدهیم، و نیازی به پاکسازی دستی هم نیست:

    $ diff -y <(head -n 1 .dictionary) <(tail -n 1 .dictionary)
    Aachen                                                  | zymurgy

قسمت ‎ <(..)‎ با فایل FIFO موقتی ایجاد شده توسط bash، تعویض می‌گردد، بنابراین diff در حقیقت، چیزی به این شکل را می‌بیند:

    $ diff -y /dev/fd/63 /dev/fd/62

در اینجا می‌بینیم که وقتی ما از جایگزینی پردازش استفاده می‌کنیم، bash چگونه diff را اجرا می‌کند. دستورهای head و tail را اجرا می‌کند، خروجی‌های آنها را به ترتیب به فایلهای ‎ /dev/fd/63‎ و ‎/dev/fd/62‎ تغییرمسیر می‌دهد. سپس فرمان diff را با قبول کردن آن نام فایلها در جایی که ما عملگرهای جایگزینی پردازش را قرار داده بودیم اجرا می‌کند.

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

    $ echo diff -y <(head -n 1 .dictionary) <(tail -n 1 .dictionary)
    diff -y /dev/fd/63 /dev/fd/62

عملگر ‎>(..)‎ بسیار همانند عملگر ‎ <(..)‎ می‌باشد، اما به جای تغییرمسیر خروجی فرمان به یک فایل، یک فایل را به ورودی فرمان تغییر مسیر می‌دهد. این برای مواردی به کار می‌رود که شما دستوری را اجرا می‌نمایید که در یک فایل می‌نویسد، اما شما می‌خواهید به جای آن در دستور دیگر بنویسد:

    $ tar -cf >(ssh host tar xf -) .


  • تکرار مفید:
    جایگزینی پردازش روش فشرده‌ای برای ایجاد خودکار فایلهای موقتی FIFO در اختیار قرار می‌دهد. آنها نسبت به زمانی که شما خودتان به طور دستی pipeهای با نام را ایجاد می‌کنید، کمتر انعطاف‌پذیر هستند، اما برای دستورات کوتاه متداول مانند diff که نیازمند نام‌فایلها برای منابع ورودی‌اشان می‌باشند، بدون نقص هستند.

پایان فصل هفتم