لینوکسی بشیم:‌ کنترل خروجی و ورودی دستورها در شل

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

تو این نوشته فرض شده شما با دستورهای رایج در لینوکس برای کار با فایل‌ها آشنایی دارید و با خط فرمان لینوکس کار کردید. خوندن قسمت‌های قبلی در صورتی که چنین شرایطی رو ندارید میتونه کمکتون کنه.

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

میتونیم خروجی sort رو به uniq بدیم. uniq میاد هر چی خط تکراری و پشت هم هست رو یکی میکنه. ولی اگه یه خط تکراری فاصله داشته باشه با بقیه اون رو حذف نمیکنه. با sort همه اینا میان کنار هم و وقتی به uniq داده میشه همه‌اش حذف میشه.‌

تو مورد بعدی از wc استفاده شده:

تفاوت رو دیدین؟ اگه از ورودی استاندارد بهش ورودی بدیم دیگه اسم فایل رو نمیاره. این کار وقتی اسکریپت می‌خوایم بنویسیم به درد میخوره چون فقط تعداد خطوط ممکنه مهم باشه.

میتونیم چند تا پشت هم از این پایپ‌ها بذاریم و چند تا کار رو تو یه خط انجام بدیم:

این جا یه خط خاص از فایل رو با tail و head بدست آوردم. البته یادتون باشه این کاری که کردم فقط برای نمایش بود وگرنه اون cat اول اضافه است و خود tail اسم فایل رو هم میگیره.

گاهی اوقات ما می‌خوایم خروجی یه دستور رو تو یه فایل بریزیم. برای این کار مسیر خروجی رو از خروجی استاندارد به یه فایل تغییر میدیم:

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

الان tail از آخر خوند و ریخت توی فایل و head از اول خوند و در ادامه‌ی فایل ریخت.

تا اینجا راجع به خروجی حرف زدیم ولی خطای استاندارد چی؟ ممکنه بخوایم اون رو هم تو یه فایل بریزیم. به طور پیشفرض < روی خروجی استاندارد کار میکنه. میتونیم خروجی استاندارد رو با عدد 1 هم نشون بدیم:

این دو تا هیچ فرقی با هم ندارن و میشه همیشه 1 رو گذاشت ولی خب چه کاریه؟ خطا رو با عدد 2 نشون میدیم:

تو اینجا روی یه فایلی که وجود نداره ls گرفتم و خطا میده و اون رو توی فایل ریختم. میتونم بگم هر دوتاشون (خروجی و خطا) برن به یه جا:

یه کار دیگه هم میشه کرد و اون استفاده از & هست. این علامت پشت 1 یا 2 میاد و به جایی که هر کدوم میرن اشاره میکنه:

اینجا گفتم خروجی رو بریز تو اون فایل و خطا رو هم بریز همونجا که خروجی میره؛ یعنی همون فایله. گاهی هم ممکنه بخوایم فقط یکیش رو بریزیم تو فایل. مثلا یه دستوری کلی لاگ میده و بین اونا چند تا پیام خطا هم میده. برای این که فقط خطاهاش رو ببینیم این کارو می‌کنیم:

الان خروجی رفته تو dev/null/. اونجا تو لینوکس جاییه که هر چی بریزیم توش از بین میره. مثل یه چاه بی‌نهایت برای ریختن زباله. در عوض خطا رو ریختم تو یه فایل تا بعدا تحلیلش کنم.
ورودی استاندارد هم بگیم. بعضی موقع‌ها میخوایم چند تا خط رو یه جا برای ورودی یه دستور بنویسیم. نمونه‌ای که اینجا آوردم cat هست. قبلا echo رو دیده بودیم که یه خط مینویسه. ولی برای چند خط میشه بهتر کار کرد:

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

چیز خاصی نداره. همه‌اش رو این قسمت دیدیم.

بحث این دفعه تموم شد. امیدوارم مفید بوده باشه. اگر نظر یا سوالی دارید این پایین بفرمایید.

قسمت قبلی

قسمت بعدی