شاید تا کنون اصطلاح داتفایل یا dotfile را شنیده باشید. این عبارت بیشتر بین کاربران حرفهای تر لینوکس/یونیکسی شایع است. در این مطلب میخواهم یک مبتدی (با احتمالا لینوکس) را با این مفهوم آشنا کنم.
به طور سنتی میدانیم، فایلها شامل اسم و پسوند هستند. مثلا فایل simple.txt یک فایل متنی است (از روی پسوند txt فهمیدم) که نام simple را دارم. یا مثلا فایل document.doc یک فایل مربوط به واژهپرداز ورد است که اسم document دارد. همچنین فرمت rtf برای متن غنی، ppt برای اسلایدهای نرمافزار پاورپوینت و ..
اما در سیستمعاملهای بهتر از ویندوز، این پسوند فایل ارزش چندانی ندارد و ما میتوانیم یک فایل با نام filename داشته باشیم. بدون هیچ پسوندی. از روی ساختار فایل مشخص میشود که این فایل، فایل متنیاست یا فیلم است یا ... ما در این مطلب با فایلهای متنی کار داریم. فایلهایی مثل سورسکدها در زبانهای برنامهنویسی، فایلهای کانفیگ و تنظیمات و ...
در سیستمعاملهای لینوکس/یونیکسی، نقطه، فقط جداکنندهی اسم فایل از پسوندن نیست. بلکه اگر در ابتدای اسم فایل قرار بگیرد، باعث میشود آن فایل حالت مخفی پیدا کند. جالب نیست؟ به جای اینکه برویم properties -> general -> mark as hidden، فقط به اول اسم فایل/فولدر، یک نقطه اضافه میکنیم و فایل به صورت هاید در میآید. برای دیدن فایلهای مخفی میتوانیم از ls -A استفاده کنید یا در فایلمنیجر، ctrl h را بزنید.
نه! داتفایلها اگرچه فایلهای مخفی هستند، ولی به عنوان کاربر هر فایل را مخفی کنیم دات فایل محسوب نمیشود. بلکه داتفایلها فایلهای تنظیمات خاصی هستند که از قضا برای اینکه به چشم کاربر عادی نیایند، به صورت مخفی قرار میگیرند.
پس تا اینجا فهمیدیم که داتفایلها فایلهای تنظیمات ابزارهای مختلف هستند اول اسمشون نقطه میاد که به معنی مخفیبودن فایل است.
فکر میکنم اولین داتفایلی که کاربران با آن برخورد میکنند، همین فایل bashrc. باشد. اسم فایل bashrc است و یک نقطه قبلش دارد. (برای اینکه در ویرگول درست بیفتد من نقطه رو بعدی تایپ کردم.)
در این فایل، کاربران (یا احیانا برنامهها) تنظیمات مربوط به برنامهی bash (که شل پیشفرض اکثر لینوکسهاست) را میریزند. از کلمهی bash در اسم bashrc هم میتوان فهمید که به برنامهی کاربردی bash مربوط است.
این فایل در پوشهی ~ (همان home) هر کاربر وجود دارد. برای مثال فایل bashrc. من در اینجاست:
حالا من اگر بخواهم تنظیماتی برای bash ام اعمال کنم باید این فایل را چه تفییری بدهم؟ آیا باید یک برنامه نصب کنم که این کارها را انجام دهد؟ آیا باید در setting خود bash بروم و تنظیماتی را عوض کنم یا در این فایل سیو شود؟ نه. نکتهی جذاب همینجاست.
دو مورد را باید بررسی کنیم. اول اینکه برنامههای موجود چطوری فایلهای کانفیگ (مثلا همین bashrc) را میخوانند. دوم اینکه این فایلها را چطوری باید تغییر دهیم؟ دستی یا با کمک یک ابزار؟
در مورد bashrc داستان ساده است. همانطور که میدانید bash یک پوستهی اجرا کننده دستور (shell) است. کارش اجرا کردن دستور (یا به صورت interactive یا اسکریپتهای نوشته شده در فایل) است. این bashrc هم از قضا یک اسکریپت است. اسکریپتی که در آن دستورات محتلف bash نوشته شده. با هربار اجرای bash (البته فقط به صورت تعاملی)، فایل bashrc. خوانده و خطبهخط اجرا میشود. این دستورات را کاربر حرفهای به گونهای مینویسد که در نتیجهی اجرا کردن آنها، bash تنظیمات موردنظرش را میگیرد. در واقع تنظیمات شامل یک سری دستور bash است که تغییراتی را با هربار اجرای bash روی آن اجرا میکند.
یک مقدار واضح تر مثال بزنم، هربار که یک ترمینال جدید باز میکنیم، باید shell هم درون آن اجرا شود. در صورتی که shell ما bash باشد، bash فراخوانی میشود. حالا bashی که اجرا شده حالت پیشفرض خودش (تنظیمنشده) را دارد. سپس (ر یک چشم به همزدن) دستورات داخل bashrc. را میخواند و اجرا میکند و در نتیجه تنظیمات رویش اعمال میشود و کاربر bash تنظیم شده را میبیند.
اما اگر یک دستور دیگر مثلا ls بزنیم، آیا باز هم همه آن دستورات اجرا میشوند؟ خیر. فقط زمانی که یک bash جدید ایجاد شود تنظیمات از فایل bashrc. خوانده میشوند.
یک کار خوب و بیخطری که خوب است الان انجام دهید این است که فایل ,bashrc خود را با یک ادیتور باز کنید و تنظیمات داخلش را ببینید. (چیزی را حذف نکنید) احتمالا چند خط تنظیمات که سازندگان توزیع شما صلاح دیدهاند آن جا نوشتهشدهاست.
اما چگونه تنظیمات bash را به کمک bashrc. میتوان عوض کرد؟ به سادگی، همین مرحله قبل که فایل را با یک ادیتور متنی باز کردید، کافیست در انتها اضافه کنید echo salam. از این به بعد، (اگر فایل را سیو کنید) هربار bash جدیدی باز شود، salam هم چاپ میشود و سپس آماده به کار میشود. همچنین میتوانید مفید تر عمل کنید، مثلا یک alias اضافه کنید.
چرا خود bash تنظیمات را در bashrc. ذخیره نمیکند؟ مثلا ما اگر در یک bash در حال اجرا، دستور alias را بزنیم و alias جدید اضافه کنیم، چرا خودش انتهای bashrc ذخیره نمیکند تا لازم نباشد خودمان آن فایل را تغییر دهیم؟ برای اینکه bash در طول اجرا ممکن است دستورات خیلی متفاوتی اجرا کند و حتی کاربر اشتباه کند و دستور نامناسبی وارد کند. اگر خود bash قرار باشد هر تغییری در آن میدهیم را در bashrc بنویسد، هر خطایی در طول کل حیات سیستم کرده باشیم در bashrc خواهد بود! حتی میتواند بسیار بزرگ و کند شود. کلا این کار منطقی نیست. در عوض میتوانیم از دستوری استفاده کنیم که وقتی یک alias داریم خودش آن را به انتهای bashrc اضافه کند. به صورت عمدی و آگاهانه! (مثلا یک رشته بسازیم و آن را با دستور >> به آخر bashrc. بریزیم.)
مطالعه بیشتر در مورد کارکرد bashrc
همانطور که حدس میزنید، bash تنها ابزاری نیست که احتیاج به تنظیم شدن دارد. ادیتورهای خوب (مثل vim و emacs) شلهای غیر از bash مثل zsh و fish، ابزار محبوب tmux و حتی ابزارهای گرافیکی مثل window manager تنظیمات شروعشان را از dotfileها میخوانند. (بعضی از ابزارهای گرافیکی اگر وارد settingشان شوید، خودشان فایل کانفیگشان را ادیت میکنند.)
مثالهایی که من با آنها کار کردهام:
فایل vimrc. فایلی است که ادیتور vim موقع اجرا، آن را میخواند. این فایل به زبان vimscript نوشته شده و در آن با اعمال دستوراتی میتوان کاملا رفتار این ادیتور را شخصیسازی کرد.
پوشهی emacs.d. پوشهی حاوی فایلهای کانفیگ ادیتور emacs
فایل config/nvim/init.vim. فایل اصلی تنظیمات ادیتور neovim است، همه تنظیمات ابزار neovim در پوشهی nvim واقع در پوشهی config. قرار دارند. بسیار از برنامهها تنظیماتشان را به پوشهی config. منتثل کردهاند.
فایل ghci. شامل تنظیمات شل ghci (کامپایلر هسکل) است.
قدم اول فهمیدن کارکرد dotfileها بود و آن را با موفقیت پشت سر گذاشتیم، اما کاربران حرفهایتر چگونه این کارها را انجام میدهند؟
جالب است بدانید که خیلی از داتفایلها به هزاران خط میرسد و معمولا کاربر در طول زمان بر خسب نیاز خودش برای برنامههای مختلفی که استفاده میکند، این تنظیمات را انجام داده. خیلی اوقات این تنظیمات در نتیجهی یک سرچ بوده تا یک مشکل خاص را حل کنیم. پس خوب است در کنار خود تنظیم، کامنتی بگذاریم که این خط چه کار میکند، چرا اضافه شده یا مثلا به صفحه استکاورفلو یا ایشوی گیتهابی که باعث حل مشکل شده اشاره کنیم.
همچنین خوب است آیندهنگری کنیم. اگر خواستیم روی یک سیستم دیگر کار کنیم باید همه هزار خط را از اول بنویسیم؟ یا باید قسمتهای مهم را جدا کنیم؟ خیلی از کاربران دات فایلهای خود را در گیتهاب/گیتلب میگذارند تا بتوانند به راحتی به آن دسترسی داشتهباشند. در نتیجه از گیت هم استفاده میکنند و تاریخچه تنظیمات قبلی خود را هم دارند. البته باید دقت کنید که در home خود git init نکنید و کل home (شامل فیلم و عکس و زندگی و ..) را کامیت کنید. بلکه فقط فایلهای کانفیگ را commit کنید!
از اینجا به بعد راههای بسیار متفاوتی وجود دارد و هر کاربر بسته به سلیقه و تسلطی که روی ابزارهای مختلف دارد، مکانیسمی برای مدیریت داتفایلها درست میکند (یا اصلا نمیکند.)
مثلا راه سادهای که برای شروع مناسب است، این است که یه ریپوزتوری داشته باشیم و هربار bashrc را تغییر میدهیم، یکبار هم در آن پوشه کپی کنیم و کامیت/پوش کنیم. همچنین استفاده از ابزار rsync هم خیلی اوفات کمککننده است.
کاربران حرفهایتر اسکریپتهای پیچیدهای مینویسند که با هر بار تغییر، چه چیزهایی باید آپدیت شود، یا مثلا اسکریپتهای نصاب. با استفاده از این اسکریپت میتوانند هربار روی سیستم جدیدی مینشینند، یک دستور را اجرا کنند و همه تنظیماتشان دانلود شود و برنامههای مورد نیاز نصب شود و مثل لپتاپ خودشان احساس راحتی داشته باشند! اما باید دقت داشت که برای شروع اصلا نیازی به این کارها نیست و قرار نیست خودمان را اذیت کنیم.
یرای شخص من، خواندن داتفایلها و تنظیمات کاربران دیگر، برای ابزارهایی که هرروز استفاده میکنم خیلی هیچان انگیز و جالب بود و مطالب جدیدی زیادی یاد گرفتم و با آنها dotfiles خودم را بهتر کردم. برای همین چند نمونه که به نظرم نمونههای تمیز و زیبایی بودند را در اینجا قرار میدهم تا شما هم استفاده کنید.
مثلا همین نکته جالب را میتوان در نظر داشت که هر کدام از این عزیزان روشهای متفاوتی برای آپدیت کردن داتفایل ها انجام دادهاند.
این جملههام،شاید شبیه حل تمرین یه درس برنامهنویسی به نظر بیاد که میگم از کدهای دیگران روی اینترنت کپی نکنید، ولی بهم گوش بدید!
البته یکی از مزیتهای گذاشتن داتفایلها در گیتهاب، دیدن کدها/تنظیمات بقیه و الگو گرفتن است، ولی اینکه عینا تنظیمات یک شخص دیگر را کپی کنیم اصلا کار صحیحی نیست. چرا که هیچ ایدهای نداریم چرا این تنظیمات وجود دارد، چطوری باید از ابزار تنظیم شده استفاده کنیم، و حتی بدتر، این تنظیمات مطلوب ما نیست و نمیدانیم چطوری تبدیل به مطلوب خودمان کنیم.
بهترین روش (از نظر من) این است که با یک کانفیگ خیلی مختصر شروع کنیم و رفته رفته با سرچ مشکلاتمان و بررسی داتفایلهای دوستان، کم کم تنظیمات کاملتری برای خودمان داشته باشیم.
باز هم تاکید میکنم کورکورانه کار نکنید، خیلی مهم است که بدانیم هر تنظیم برای چی وجود دارد و اگر نباشد چه اتفاقی میافتد و چه گزینههای دیگری در دسترس است.
مطالعه بیشتر:
ویکیپدیا
معرفی کلی ابزار و بهروش در مورد dotfileها