5. لولهها(Pipes)
حال که میتوانید بدون دردسر توصیفگرهای فایل را برای هدایت انواع معینی از خروجیها به فایلهای معین، مدیریت نمایید، وقت آنست که رموز مبتکرانهتری که برای تغییرمسیر ورودی و خروجی در دسترس میباشد را بیاموزید.
میتوانید از تغییرمسیرفایل برای نوشتن خروجی در فایلها یا خواندن ورودی از فایلها، استفاده کنید. اما اگر بخواهید خروجی یک برنامه را به طور مستقیم به ورودی برنامه دیگر مربوط کنید چطور؟ از آن طریق میتوانید زنجیر پیوستهای از پردازش خروجی ایجاد کنید. اگر از قبل درباره
$ ls $ mkfifomyfifo ; lsmyfifo $ grepbea myfifo & [1] 32635 $ echo \"rat > cow > deer > bear > snake\"> myfifo bear
از دستور mkfifo برای ایجاد یک فایل جدید به نام \'myfifo\' در دایرکتوری جاری استفاده کردیم. این یک فایل معمولی نیست، بلکه یک
در مثال ما،
اما این فایلهای موقتی یک اذیت واقعی هستند. شاید شما مجوز نوشتن نداشتهباشید. لازم است به خاطر داشته باشید که فایلهای موقتی که ایجاد نمودهاید را پاک کنید. لازم است مطمئن شوید که دادهها وارد و خارج میشوند، یا شاید
به خاطر این مسائل، ویژگی دیگری در دسترس قرارگرفته است: لولهها. در اصل، لوله فقط
$ echo \"rat > cow > deer > bear > snake\"| grepbea bear
لوله با استفاده از عملگر
لولهها به طور وسیعی به عنوان پسپردازش خروجی برنامهها به کار میروند. به
وقتی خط لوله به پایان میرسد، پوستههای فرعی که برای آن ایجاد شدهاند نیز خاتمه مییابند. همراه با پوستههای فرعی، هر تغییر و تبدیل انجام شده در آنها نیز از بین میرود. بنابراین مراقب باشید! تکرار مفید: چطور میتوان دو پردازش را با استفاده از لولههای بانام (fifoها)به یکدیگر ارتباط داد؟
عملگر لوله برای هر دستور یک محیط پوسته فرعی ایجاد میکند. آگاهی از این مطلب اهمیت دارد، به علت آنکه، هر متغیری که در دستور دوم تعیین یا ویرایش کنید، در خارج از آن به صورت ویرایش نشده قبلی ظاهر میگردد. اجازه بدهید تشریح نمایم:
$
لولهها به عنوان پسپردازشگر خروجی برنامهها، خیلی جالب هستند. به هرحال، شما بایدمراقب باشید در کاربرد آنها زیادهروی نکنید. اگر شما خطلولهای که شامل سه برنامه یا بیشتر باشد را به انتها برسانید، وقت آنست که از خود بپرسید آیا در حال انجام امور به روش هوشمندانهای هستید؟ امکان دارد قادر باشید ویژگیهای بیشتری از برنامه را نسبت به آنچه در یک پسپردازش در لوله به کار گرفتهاید، استفاده کنید. هر دستور جدید در یک خطلوله موجب یک پوسته فرعی جدید میگردد و یک برنامه جدید باید بارگزاری شود. همچنین این مطلب دنبال کردن منطق اسکریپت شما را دشوار میسازد!
من متغیرهایی را در یک حلقه مقرر میکنم. چرا آنها پس از اتمام حلقه، ناگهان ناپدید میگردند؟ یا، چرا نمیتوانم دادهها را برای خواندن لولهکشی نمایم؟