لینوکس در یک نگاه
لینوکس یک سیستمعامل است، مثل ویندوز و مک — یعنی همان چیزی که کامپیوتر را میگرداند. سه چیز که کافی است بدانی:
- تقریباً همهی سرورهای دنیا لینوکساند. پس هر وقت حرف از سرور شد، احتمالاً حرف از لینوکس است.
- مک از خانوادهی نزدیک لینوکس است (هر دو از یک تبار یونیکساند). به همین دلیل دستورهایی که در مستندات میبینی معمولاً روی مک هم کار میکنند و روی ویندوز نه.
- «توزیع» یعنی نسخه. اوبونتو، دبیان، فدورا — همه لینوکساند با بستهبندی متفاوت. اوبونتو رایجترین است. این کلمه را زیاد میشنوی و معنایش همین است، نه بیشتر.
و یک نکتهی عملی برای تو: اگر روی ویندوزی و مستندی دستور لینوکسی داد، معادل ویندوزیاش را از ایجنت بپرس — این یکی از تمیزترین کاربردهای فصل ۴.۳.۲ است.
terminal کمی جدیتر
در فصل ۰.۸ ترمینال را باز کردی و کار کردی. حالا سه مفهومی که آنجا لازم نبود و اینجا به کارت میآید:
- پوشهی جاری. ترمینال همیشه «داخل» یک پوشه است، و دستوری که میزنی نسبت به همان پوشه معنا دارد. بیشترِ خطاهای «فایل پیدا نشد» فقط همین است: در پوشهی اشتباهی هستی.
- خروجی و خطا دو کانال جدا هستند. بعضی برنامهها نتیجه را در یکی و پیام خطا را در دیگری مینویسند. به همین دلیل گاهی یک دستور «هیچی نگفت» ولی واقعاً خطا داشت — یا برعکس، متنِ قرمز دیدی که خطا نبود.
- کد خروج. هر دستور بعد از تمامشدن یک عدد برمیگرداند: صفر یعنی موفق، هر چیز دیگری یعنی مشکل. این تنها راهِ ماشینیِ فهمیدن موفقیت است، و به همین دلیل است که ایجنت میتواند بفهمد کاری گرفت یا نه.
بهخاطر بسپار «هیچ خروجیای نداد» در ترمینال معمولاً یعنی موفق بود. این برعکسِ انتظار آدم است. ابزارهای این دنیا سنتی دارند: وقتی کار درست پیش برود ساکتاند، و فقط وقتی حرف میزنند که مشکلی باشد. پس سکوت، خبر خوب است.
فایل، مسیر، دسترسی
مسیر آدرس یک فایل است، و دو شکل دارد — همان تفکیکی که فصل ۳.۲.۳ از دید کاربردی گفت:
- مسیر مطلق از ریشه شروع میشود و همیشه یک جا را نشان
میدهد:
/Users/name/docs/file.md. - مسیر نسبی از پوشهی جاری شروع میشود:
docs/file.md. کوتاهتر است ولی معنایش به جای ایستادنت بستگی دارد.
و دو علامتِ پرتکرار: . یعنی «همین پوشه» و
.. یعنی «پوشهی بالاتر». پس
../data یعنی «یک پله بالا برو، بعد داخل data». و
~ یعنی پوشهی خانگی خودت.
دسترسی (permission — و دقت کن که این با پنجرهی اجازهی فصل ۳.۳ فرق دارد؛ آن مربوط به ایجنت است، این مربوط به سیستمعامل) یعنی سیستمعامل برای هر فایل ثبت کرده چه کسی چه کاری میتواند بکند:
- خواندن · نوشتن · اجرا — سه اجازه، برای سه گروه: مالک، گروه، بقیه.
- و ریشه (root) کاربری است که همهی این محدودیتها را رد
میکند. وقتی جایی
sudoمیبینی، یعنی «این را با اختیار ریشه اجرا کن».
و همینجا یک هشدار عملی که به M5 وصل میشود: هر جا
sudo دیدی، آن دستور میتواند هر چیزی را عوض
کند — یعنی محافظتهای معمولِ سیستمعامل جلویش را نمیگیرند. این دقیقاً
همان جایی است که فصل ۳.۳.۲ گفت قبل از «بله» بخوان.
فرآیند و سرویس: چیزی که همیشه روشن است
دو کلمه که تفاوتشان کل فصل ۷.۴ را قابل فهم میکند:
- فرآیند (process) یک برنامهی در حال اجرا است. وقتی ترمینال را میبندی، فرآیندهایی که از آن شروع کردهای معمولاً میمیرند. به همین دلیل کاری که «داشت اجرا میشد» با بستنِ پنجره متوقف میشود.
- سرویس (service) فرآیندی است که قرار است همیشه روشن بماند — و اگر بمیرد، سیستم خودش دوباره روشنش میکند. سرویس به ترمینالِ تو وابسته نیست.
و این تفاوت، جوابِ سؤالی است که خیلیها دارند: «اتوماسیونم را نوشتم، چرا وقتی لپتاپم را میبندم کار نمیکند؟» چون یک فرآیند ساختهای، نه یک سرویس. و تبدیلِ اولی به دومی همان چیزی است که در فصل ۷.۴ اسمش deploy است.
یک کلمهی مرتبط هم که زیاد میشنوی: پورت. یک شماره است که
میگوید روی یک ماشین، کدام برنامه به کدام درِ ورودی گوش میدهد. وقتی میبینی
localhost:3000، یعنی «روی همین کامپیوتر، برنامهای که
به درِ ۳۰۰۰ گوش میدهد».
تمرین (فکری)
این چهار واژه را با زبان خودت توضیح بده — هر کدام یک جمله، بدون نگاهکردن به متن بالا:
- مسیر نسبی چه فرقی با مطلق دارد؟
sudoچه کاری میکند و چرا باید حواست باشد؟- فرآیند و سرویس چه فرقی دارند؟
- پورت چیست؟
بعد جوابهایت را به ایجنت بده و بگو «کدامیک از اینها دقیق نیست؟»
پاسخنامه — چهار جمله، و آن یکی که همه اشتباه میگویند
۱. مسیر مطلق از ریشه شروع میشود و همهجا یک معنا دارد؛ مسیر نسبی از جایی که ایستادهای شروع میشود، پس معنایش عوض میشود.
۲. دستور را با اختیار کاربر ریشه اجرا میکند، یعنی محدودیتهای دسترسی جلویش را نمیگیرند — پس میتواند چیزهایی را عوض کند که معمولاً محافظتشدهاند.
۳. فرآیند به ترمینالی که از آن شروع شده وابسته است و با بستنش میمیرد؛ سرویس مستقل است و اگر بمیرد خودش دوباره روشن میشود.
۴. شمارهای که مشخص میکند روی یک ماشین، کدام برنامه به کدام درِ ورودی گوش میدهد.
و آن یکی که همه اشتباه میگویند: شمارهی ۳. جواب رایج این است که «سرویس بزرگتر است» یا «سرویس مهمتر است» — که هیچکدام نیست. تفاوت در وابستگی است، نه در اندازه یا اهمیت. یک اسکریپت سهخطی هم میتواند سرویس باشد. و اگر این را دقیق نفهمی، فصل ۷.۴ گنگ میماند، چون کلِ deploy یعنی همین تبدیل.