چگونه یک Terminal حرفه ای و زیبا در MacOS و یا Linux داشته باشیم؟

در این مطلب، میخواهیم با فراگیری چند مفهوم ساده و پرکاربرد، صفر تا صدِ خلق یک ترمینال مهیج، زیبا و کاربردی برای سیستم عاملتان را آموزش ببینیم. MacOS یا Linux، فرقی نمیکند.مراحل فراگیری در این مطلب به این شکل می باشد : شِل ( shell ) به زبان ساده چیست؟کوچ کردن از یک شِل قدیمی (bash) به یک شِل جدید (zsh)چرا و به چه علت zsh بهتر از bash می باشد؟ (مزیت های zsh)نصب و کانفیگ zsh و oh-my-zsh روی macOS و Linuxمعرفی چند پلاگین مهم و تمام شِل ( shell ) به زبان ساده چیست؟همه‌ی انسان‌های دنیا با زبان خاص خودشان صحبت میکنند و در نهایت، خواست، نیاز و یا هرچیزی را به واسطه آن (زبانشان) انتقال می دهند. در این میان مترجمانی نیز وجود دارند که زبان های مختلف را به یکدیگر تبدیل و یا ترجمه میکنند. حالا ارتباط این داستان با شِل چیست ؟ همانطور که میدانید زبان هسته (kernel) سیستم عامل صفر و یک می باشد، در حقیقت ما به کمک شِل با هسته سیستم عامل صحبت میکنیم و به آن دستور میدهیم. در واقع شِل مترجم ما می باشد که یک دستور ( command ) قابل فهم برای ما را به هسته سیستم عامل می دهد تا هسته عملیات مورد نیازمان را انجام دهد. در تعریفی دقیق تر به برنامه ای که از طریق دستورات خطی می توان به امکانات سیستم عامل دسترسی داشت و از آنها استفاده کرد شِل می گویند.مثلا وقتی که از دستورات cd یا ls و یا mv استفاده میکنید، این ‌دستورات به واسطه یک شِل تبدیل به دستورات قابل فهم برای هسته می شوند و عملیات مورد نظر انجام می گیرد ( البته نه به این سادگی که گفته میشود).انواع شِل: ما شِل های مختلفی داریم مثل B shell، C-shell، K shell، Bash، tcsh، Zsh.هرکدام از این شِل ها پیشینه خاص خودشان را دارند و برای نیازهای مختلفی تهیه و طراحی شده اند، ولی همه‌ی شما تقریبا Bash را میشناسید چون شِل پیش فرض اکثر سیستم عامل ها می باشد. Bash شِل محبوبی است که با جستجو در اینترنت می توانید تاریخچه و اطلاعات زیادی رو در مورد آن بدست بیاورید. فراگیری مفهوم شِل به همین اندازه کفایت می کند و ما بیشتر از این وارد این معقوله نمیشویم و به سراغ شِل محبوب zsh می رویم.کوچ کردن از یک شِل قدیمی (bash) به یک شِل جدید (zsh)حال، برای این که بتوانیم یک Terminal زیبا و کاربردی ( با plugin ها و theme های مختلف برای کارهای متفاوت، مثلا همسان سازی با git و ruby و python و ... ) داشته باشیم قصد داریم یک نسخه دیگری از شِل که همانند Bash خیلی محبوب و پرطرفدار می باشد را نصب و کانفیگ کنیم، این شِل zsh نام دارد! چرا و به چه علت zsh بهتر از bash می باشد؟ (مزیت های zsh)۱. همخوانی کامل با bashدو shell محبوب bash و zsh همانند یکدیگر کار میکنند و دستورات آن ها یکسان می باشد، با این تفاوت که zsh امکانات بیشتری را نسبت به bash ارائه میدهد به این معنی که اگر با bash عجین شده اید، نیاز نیست نگران باشید. zsh دقیقا همانند bash فقط با امکانات بیشتر است.۲. انتخاب ساده تر دایرکتوری هادر هنگام اجرای دستورانی مانند cd و یا ls که قرار هست با لیست دایرکتوری ها کار کنیم با زدن کلید TAB و یا حتی بالا، پایین، چپ، راست بین فایل ها و فولدر ها جا به جا شویم و یکی را انتخاب کنیم.۳. خلاصه کردن نام دایرکتوری هادر هنگام اجرای دستورانی مانند cd و یا ls که قرار هست با لیست دایرکتوری ها کار کنیم دیگر لازم نیست نام کل فولدر یا فایل را بنویسید، کافیست یک یا چند حروف اول آن را تا زمان یونیک و یکتا شدن نوشته و با زدن Tab همه آن را تکمیل کنید.۴. دارای تاریخچه هوشمند ( Smart history )شما میتوایند با زدن کلید بالا و پایین بعد از دستوری که در گذشته استفاده کرده اید به تاریخچه آن دسترسی پیدا کنید. در مثال زیر برای ls میبینیم که به تمام ls هایی که در گذشته استفاده کرده ایم دسترسی داریم. ۵. اشتراک گذاری همزمان دستورات در تمام تَب های فعال ( Shared command history )یکی از مشکلات بزرگی که bash با آن رو به رو بود این قضیه است، به این شکل که اگر شما دستوری را در یکی از تَب های Terminal وارد میکردید در تَب دیگر هیچ اثری از آن نمی توانستید پیدا کنید. مثلا با استفاده از CTRL + R ( جستجو در دستورهایی که زده اید ) نمیتوانستد آن را در تَب دیگری جستجو کنید. از این به بعد با zsh در تمامی تَب های فعال Terminal به تاریخچه دستورها دسترسی دارید.برای کسانی که نمیدانند: با استفاده از CTRL + R میتوانید در دستورهایی که در گذشته استفاده کرده اید جستجو و آن را اجرا کنید. CTRL + R یکی از روش های مورد علاقه من در کار با ترمینال می باشد. مثلا برای اجرای emulator آندروید فقط نام دیوایس را سرچ میکنم و با زدن Enter، آن emulator را اجرا میکنم. دقت کنید که CTRL + R بعدی نتیجه های بعدی را به شما نمایش می دهد.۶. هخوانی با git ( از گیت لذت ببرید) امکان دارد هرکسی برای گیت یا هر دستور دیگری alias های خودش رو داشته باشه،‌ zsh هم مجموعه ای از این alias ها یا نام های مستعار رو به همراه خودش دارد. برای دیدن همه alias ها از این دستور استفاده کنید: alias | grep git در این میان دانستن این نکته خالی از لطف نیست که ضربدر قرمز رنگ قبل از mimalef70 نشان دهنده ای است که دستور قبلی وارد شده با خطایی مواجه شده است و FALSE برگردانده.همچنین وقتی در داکیومنتی هستید که فایل git در آن موجود است کار شما ساده تر میشود و میتوانید اطلاعاتی رو به واسطه رنگ ها و اعلان های متفاوت ( بسته به theme ای که برای zsh نصب میکنیم ) از پوشه git خود بدست بیارید. مثلا در این عکس متوجه میشویم که در برنچ master هستیم و آن رنگ زرد به این معنی می باشد که یک تغییر uncommited داریم. ۷. من منظورتو میدونم و خودم اصلاحش میکنم! گاهی وقت ها در کوچک و یا بزرگ وارد کردن حرف اول دایرکتوری و یا فایل هایمان اشتباه میکنیم، و یا اینکه فقط به کلمه میانی ( مثل box در Dropbox ) آن دایرکتوری برای تایپ مسلط هستیم! zsh بعد از زدن Tab به صورت خودکار آنهارا اصلاح و فایل اصلی را انتخاب میکند. ۸. مخفف های مفید برای بازگشت از دایرکتوری ها:در zsh مخفف ( alias ) های مفید بسیار زیادی وجود دارد و خود من به شخصه از طرفدارهای ( .. ) و ( ... )‌ و ( ....‌ ) هستم که به ترتیب ۱ ،‌۲ و ۳ دایرکتوری به عقب برمیگردند. مثلا (../.. cd ) برابراست با ( ... ). ۹. نصب Theme ها و Plugin های متعدد و بسیار کاربردیhttps://github.com/sindresorhus/pureبا استفاده از oh-my-zsh که یک فریمورک برای zsh به حساب می آید و با کمک آن شما میتوانید به راحتی zsh خود را کانفیگ کرده و همچنین به تعداد زیادی plugin و theme دسترسی داشته باشید که بعضی در هسته خود فریمورک و بعضی بصورت مجزا قابل دسترس می باشند. مثلا عکس بالا که مربوط به تِم pure می باشد و پلاگین git برروی آن فعال شده است و یا Terminal خود من که در اسکرین شات ها و گیف ها ملاحضه کردید، تِم Cobalt2 است که در iterm2 ( ترمینال بهتری برای macOS ) راه اندازی کرده ام. یک theme معروف به نام powerlevel9k وجود دارد که برای راه اندازی اون باید font های مربوط به اون رو هم نصب کنید که در راهنمای نصبش توضیح داده شده ( البته خود من به شخصه این theme رو بخاطر شلوغ بودنش نمی پسندم ولی برای مانیتورهای سایز بزرگ جالب هستش ). فیچرهای متعددی دیگری نیز برای zsh وجود که من رایج ترین آن ها را به شما معرفی کردم،‌ با جستجو و برحسب نیازتان میتوانید به تعداد بیشتری از آنها دسترسی پیدا کنید کنید. (‌ دقت کنید که بعضی از فیچر های گفته شده در بالا به oh my zsh بازمیگردد و با نصب zsh به تنهایی قابل دسترس نمی باشند ).حال اگر قانع شده اید که zsh مناسب احوال شماست، پس آماده chsh باشید!برای کسانی که نمی دانند chsh چیست: شما با استفاده از chsh شِل سیستم عامل خود را تغییر می دهید. مثلا میتوانید با chsh از شِل zsh دوباره به شِل bash برگردید و بالعکس.نصب و کانفیگ zsh و oh-my-zsh بر روی macOS و Linuxمن در این راهنما سعی کرده ام همه چیز را به صورت کامل و مفصل توضیح دهم،‌ چون بسته به نسخه سیستم عامل شما امکان روی دادن اشکالاتی وجود دارد و من تا حد ممکن همه آن هارا پوشش داده ام.مراحل کاری :نصب zshنصب oh my zsh و کانفیگ کردن آنبهترو بهترش کن! ۱. با توجه به این راهنما ابتدا zsh را نصب میکنیم:برای macOS: ابتدا Homebrew را نصب نمایید و سپس دستور زیر را وارد کنید :brew install zsh zsh-completions // !شاید مجبور شوید وی پی ان خود را روشن کنیدبرای Ubuntu, Debian & derivatives:با استفاده از apt و یا apt-get :apt install zshدر صورتی که از سیستم عامل های دیگری استفاده میکنید به لینک راهنما مراجعه کنید.بعد از نصب zsh ترمینال خود را یک بار ببندید و سپس باز کنید (‌ در بعضی مواقع باید logout / relogin کرد و یا از دستور exec zsh استفاده نمود‌ه و یک تَب جدید باز کنید ). با استفاده از دستور echo shell سیستم عامل شما آدرس شِل در حال اجرا را به شما برمیگرداند. $ echo $SHELL usr/local/bin/zsh // چیزی شبیه به این برای بازگردانده میشوددر صورتی که bash یا چیز دیگری به شما بازگردانده شد ما باید شِل zsh را به سیستم عاملمان معرفی کنیم. با استفاده از which zsh آدرس zsh را پیدا میکنیم و با استفاده از chsh آدرس شِل سیستم عامل را به آدرس zsh تغییر میدهیم. ( دقت کنید که بسته به نوع سیستم عامل شما مقادیر زیر میتواند متفاوت باشد پس کپی پیست نکنید!‌ )‌ $ which zsh /usr/local/bin/zsh $ chsh -s /usr/local/bin/zshکاربران macOS توجه کنند که نسخه پیش فرضی از zsh روی سیستم عامل آنها نصب می باشد که آدرس آن bin/zsh/ است. یعنی اگر شما which zsh را بزنید این آدرس را به شما میدهد. در صورتی که میخواهید نسخه جدیدتری که توسط Homebrew نصب شده است را فعال نمایید این دستور را وارد کنید:‌$ chsh -s /usr/local/bin/zshدر صورتی که با خطای non-standard shell مواجه شدید فایل etc/shells/ را ویرایش کنید و خروجی which zsh ای که برای سیستم عاملتان non-standard محسوب میشود را در کنار بقیه شِل ها بگذارید تا این آدرس مورد تایید سیستم عامل قرار گیرد ( nano /etc/shells )در مرحله آخر نصب zsh ترمینال خود را یک بار ببندید و سپس باز کنید و یا یک تب جدید بازکنید. (‌ در بعضی مواقع باید logout / relogin کرد و یا از دستور exec zsh استفاده نمود‌ه و tab جدیدی بازکنید ). اگر تمام مراحل را درست رفته باشد با دستور echo $SHELL این بار حتما zsh به شما بازگردانده خواهد شد. ۲. سپس فریمورک oh my zsh را با توجه به راهنمایی که در این صفحه شده نصب می کنیم : با استفاده از curlsh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"و یا wgetsh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"بعد از انجام این کار oh-my-zsh در پوشه oh-my-zsh‍‍./~ نصب می شود و ازین به بعد تمام theme ها و plugin های شما در این پوشه قرار میگیرند. برای تنظیم این فریمورک فایل zshrc. که در این آدرس می باشد zshrc./~ را باز کنید (‌ با استفاده از editor مورد علاقه تان، برای مثال من از nano استفاده کرده ام ).nano ~/.zshrcبا استفاده از این فایل میتوانید plugin ها و theme های مورد علاقه خود را فعال کنید. برای مثال در این فایل قسمت پلاگین های من چیزی شبیه به این می باشد: plugins=( git docker extract )میتوانید لیست کاملی از پلاگین ها را در این دو آدرس ( لینک ۱ - لینک ۲ ) مشاهده بفرمایید. همچنین قسمت theme اینگونه است : ZSH_THEME="robbyrussell"میتوانید لیست کاملی از theme ها را در این دو آدرس ( لینک ۱ - لینک ۲ ) مشاهده بفرمایید. همچنین بعضی از آن ها صفحه github مخصوص خودشان را دارند که با جستجو می توانید به موارد این چینی نیز برسید. در لینک شماره یک theme های مربوط به هسته فریمورک را مشاهده میکند که نیازی به نصب خاصی ندارند و فقط باید در ZSH_THEME تعریف شود، مگر بعضی ها مثل agnoster که پیش نیاز خاصی را میطلبند.توجه کنید که بعضی از theme ها پیش نیازهای خاص خودشان مثل font را دارند که باید از طریق راهنمای نصب صورت بگیرد. مثلا در cobalt2 که برای iterm2 ساخته شده است (‌ البته در terminal معمولی هم جواب میدهد ولی برای شبیه شدن به آن باید پروفایل رنگ ها را در ترمینالتان ویرایش کنید ). شما یک پروفایل رنگ مخصوص iterm2 دارید که باید import شود و همچین باید فونت خاصی را هم روی سیستم عاملتان نصب کنید.بعد از انجام تغییرات با استفاده از source ~/.zshrc تعییرات خود را اعمال کنید.با مقدار random برای ZSH_THEME این گیف را ببینید، که به صورت تصادفی از theme های zsh انتخاب میشود: نکته خیلی مهم : در zsh دیگر فایل bash_profile. فراخوانی نمیشود و شما ازین به بعد باید با zshrc. کار کنید. در صورتی که در bash_profile. و یا bashrc. چیز خاصی را اضافه کرده اید با استفاده از دستور nano ~/.zshrc به zshrc. انتقال دهید.و تمام! ما یک ترمنیال مجهز شده به zsh داریم که میتوانیم theme ها و plugin های مختلف را روی آن نصب و فعال کنیم،‌ همچین از تمام فیچرها و خصوصیت هایی که در بالا گفته شد استفاده کنیم. بهترو بهترش کن!این قسمت جایزه می باشد و من چند مورد جالب را به شما معرفی خواهم کرد:اگر کاربر macOS هستید حتما iterm2 را نصب کنید و از ترکیب آن با zsh لذت ببرید. (‌ این لینک را هم ببینید).پلاگین extract را حتما نصب کنید، با استفاده از آن می توانید هر نوع فایل فشرده شده ای را به راحتی extract کنید.یک ابزار فوق العاده به نام z ! برای رفتن به دایرکتوری هایی که در گذشته به آن ها سر زده اید، ولی فقط با یک کلمه کلیدی! میتونید از این لینک برای نصبش اقدام کنید.۴. اگر در گیف بالا دقت کنید دایرکتوری هایی با رنگ طوسی به من پیشنهاد شده است. اسم این پلاگین Auto suggestions می باشد که میتوانید از اینجا آن را نصب کنید.۵. اگر دوست دارید از طریق ترمینالتان از یوتیوب و سایت های که سرویس ویدیو دارند، ویدیو دانلود کنید سری به این لینک بزنید. ( میتونید با option های مختلفش proxy هم براش ست کنید، داکیومنتشو مطالعه کنید )پایان .....لطفا در صورتی که پیشنهادی برای کامل تر شدن و یا بهبود این مطلب دارید لطفا از طریق توییتر mimalef70@ و یا ایمیل mostafa.a.aut@gmail.com با من در ارتباط باشید.برای نوشتن این مطلب زمان زیادی صرف شده،‌ لطفا با بازنشر اون به جامعه کامپیوتری ایران، و همچنین با حف‍ظ کپی رایت به بنده لطف کنید، با تشکر. http://vrgl.ir/AoVfX