خروجی عجیب پایپ لاین یونیکس، این رو امتحان کنین و سوادتون رو عمیق تر کنین

هیچ چیزی عجیب نیست، ماییم که کم می‌دونیم
هیچ چیزی عجیب نیست، ماییم که کم می‌دونیم

اگر از یونیکس / لینوکس / مک و کامند لاین های مشابه استفاده می کنین خروجی این دستور رو چک کنین:

(echo red; echo green 1>&2) | echo blue

خروجی به شکل جالبی ممکنه هر کدوم از اینها باشه:

blue
green

یا

green
blue

یا

blue

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

اما ببینیم اینجا وضع چیه. ما داریم دو تا کامند echo اجرا می کنیم و خروجی رو پایپ می کنیم به یک echo دیگه. مساله اینه که پرانتز یک شل جدید درست می کنه و اکو دستور داخلی شل است. پس ما دو تا اکو داریم که با هم مسابقه می ذارن.

توجه کنید که اگر echo red اجرا بشه، خروجی اش به عنوان ورودی به echo blue داده می شه که تاثیری نداره.

یک چیز دیگه رو هم اینجا باید بلد باشیم و اون SIGPIPE است. توی یونیکس پروسه رو با سیگنال ها کنترل می کنیم و وقتی می گیم kill -9 folan در واقع با فرستادن سیگنال ۹ به فلان، مجبورش کردیم سریعا قطع بشه. یک سیگنال SIGPIPE هم داریم که برابر عددی اش ۱۳ است و وقتی ارسال می شه که یک پروسه سعی کنه روی پایپی که بسته شده بنویسه. این کار باعث پایان کار اون پروسه می شه. این رو هم می دونیم که echo دستور داخلی است و وقتی در داخل یک شل اجرا می شه، تنها یک پروسه داره – حتی اگر دو بار اجرا بشه.

حالا برگردیم سر عبارت قشنگمون:

(echo red; echo green 1>&2) | echo blue

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

  1. هر دو اکوی سمت چپ تموم می شن و بعد اکوی سمت راست اجرا می شه. اینجا اول سبز چاپ می شه و بعد آبی
  2. اکوی قرمز چاپ می شه (و کاربردی نداره چون به ورودی اوکی بعدی تبدیل شده که بی معنیه) و بعد اکوی آبی تموم می شه و بعد اکوی سبز. در اینجا SIGPIPE نداریم چون اکوی سمت چپ در حال اجرا است و نتیجه «آبی سبز» خواهد بود.
  3. اول از همه اکوی آبی اتفاق می افته و قبل از اینکه اکوی قرمز تموم بشه و چیزی روی پایپ بیاد، SIGPIPE رو می فرسته. اینکار کل شل داخل پرانتز سمت چپ رو می بنده و نتیجه فقط آبی است

چنین چیزهایی در دنیای واقعی تقریبا کاربرد ندارن ولی باعث دانش و درک عمیقتر ما از یونیکس و سیستم عامل ها می شن. امیدوارم لذت برده باشین و امیدوارم با لذت بیشتر، بحث سیگنال های یونیکس رو از اینجا بخونین همچنین منبع اصلی رو هم نگاه کنین چون جواب های کاملتری هم داره.