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

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

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

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

لوله ها(pipes)

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


5. لوله‌ها(Pipes)

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

می‌توانید از تغییرمسیرفایل برای نوشتن خروجی در فایلها یا خواندن ورودی از فایلها، استفاده کنید. اما اگر بخواهید خروجی یک برنامه را به طور مستقیم به ورودی برنامه دیگر مربوط کنید چطور؟ از آن طریق می‌توانید زنجیر پیوسته‌ای از پردازش خروجی ایجاد کنید. اگر از قبل درباره FIFOها، آگاه بودید، می‌توانستید با استفاده از چیزی مانند این مثال آن را کامل کنید:

    $ ls
    $ mkfifo myfifo; ls
    myfifo
    $ grep bea myfifo &
    [1] 32635
    $ echo "rat
    > cow
    > deer
    > bear
    > snake" > myfifo
    bear

از دستور mkfifo برای ایجاد یک فایل جدید به نام 'myfifo' در دایرکتوری جاری استفاده کردیم. این یک فایل معمولی نیست، بلکه یک FIFO است(که از عبارت First In, First Out اخذ گردیده). فایلهای FIFO فایلهای ویژه‌ای هستند که جهت داده‌های مبتنی بر First In, First Out به کار می‌روند. وقتی از یک FIFO می‌خوانید، فقط داده‌ها را به محض اینکه پردازش دیگری در آن فایل می‌نویسد، دریافت می‌کنید. همینطور یک FIFO هرگز به طورواقعی محتوی هیچ داده‌ای نیست. تا وقتی که پردازشی در آن نمی‌نویسد، هر گونه عملیات خواندن از FIFO در انتظار رسیدن داده‌های معتبر متوقف می‌گردد. همین کار برای نوشتن در FIFO انجام می‌شود -- نوشتن نیز تا وقتی پردازش دیگری در حال خواندن از FIFO است، متوقف می‌شود.

در مثال ما، FIFO با نام myfifo توسط grep خوانده می‌شود. پردازش grep منتظر می‌ماند تا اطلاعات در FIFO قابل دسترس بشوند . اینکه چرا ما عملگر & را به دستور grep پیوست می‌کنیم، برای آنست که آن را در پس‌زمینه قرار دهیم. به این ترتیب، ما می‌توانیم در حالیکه grep در انتظار داده می‌ماند، به تایپ و اجرای دستورات ادامه بدهیم. دستور echo اطلاعات را به FIFO تغذیه می‌کند. به مجرد اینکه این داده قابل دسترس می‌شود، دستور در حال اجرای grep آن را می‌خواند و پردازش می‌کند. نتیجه نمایش داده می‌شود. ما به طور موفقیت‌آمیزی داده را از دستور echo به فرمان grep فرستاده‌ایم.

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

به خاطر این مسائل، ویژگی ‌دیگری در دسترس قرارگرفته است: لوله‌ها. در اصل، لوله فقط stdout یک فرایند را به stdin فرایند دیگر ارتباط می‌دهد، یعنی لوله‌کشی مؤثر داده‌ها از یک پردازش به دیگری. مجموعه کامل دستوراتی را که به این صورت با هم متصل شده‌اند، خط لوله می‌نامند. بیایید مثال فوق را دوباره امتحان کنیم، اما با استفاده از لوله‌ها:

    $ echo "rat
    > cow
    > deer
    > bear
    > snake" | grep bea
    bear

لوله با استفاده از عملگر | بین دو دستور که با هم متصل می‌گردند، ایجاد می‌شود. stdout دستور قبلی به stdin دستور بعدی متصل می‌گردد. در نتیجه، grep می‌تواند خروجی echo را بخواند و نتیجه عملیات خود را که bear است نمایش بدهد.

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

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

    $ message=Test
    $ echo 'Salut, le monde!' | read message
    $ echo "The message is: $message"
    The message is: Test
    $ echo 'Salut, le monde!' | { read message; echo "The message is: $message"; }
    The message is: Salut, le monde!
    $ echo "The message is: $message"
    The message is: Test

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


  • تکرار مفید:
    لوله‌ها به عنوان پس‌پردازشگر خروجی برنامه‌ها، خیلی جالب هستند. به هرحال، شما بایدمراقب باشید در کاربرد آنها زیاده‌روی نکنید. اگر شما خط‌لوله‌ای که شامل سه برنامه یا بیشتر باشد را به انتها برسانید، وقت آنست که از خود بپرسید آیا در حال انجام امور به روش هوشمندانه‌ای هستید؟ امکان دارد قادر باشید ویژگی‌های بیشتری از برنامه را نسبت به آنچه در یک پس‌پردازش در لوله به کار گرفته‌اید، استفاده کنید. هر دستور جدید در یک خط‌لوله موجب یک پوسته فرعی جدید می‌گردد و یک برنامه جدید باید بارگزاری شود. همچنین این مطلب دنبال کردن منطق اسکریپت شما را دشوار می‌سازد!




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

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