۹ نکته و ترفند Bash که هر کاربری باید بداند

برای کاربران لینوکس، اولین باری که ترمینال را باز میکنند و شروع به کار با سیستم میکنند، لحظهای خاص است. با این حال، اولین تجربه شما در ترمینال ممکن است ترسناک باشد، زیرا تنها با یک نشانگر چشمکزن و دنیایی از امکانات بیپایان روبرو میشوید. برای کمک به این موضوع، ما چند نکته و ترفند Bash را نشان میدهیم تا در ترمینال هوشمندانهتر کار کنید.
Bash در برابر ترمینال
اگر فکر میکنید Bash همان ترمینال است و بالعکس، اشتباه میکنید. ترمینال برنامهای (یا رابط گرافیکی) است که در آن دستورات را تایپ میکنید تا با سیستم تعامل کنید. Bash پوستهای (زبان برنامهنویسی برای UNIX) است که دستوراتی که تایپ میکنید را تفسیر و اجرا میکند. بنابراین، وقتی ترمینال را باز میکنیم و روی آن کار میکنیم، در واقع با پوسته Bash (یا zsh، fish یا هر پوستهای که با سیستم شما همراه است) سروکار داریم. نکات و ترفندهای زیر دستورات خط فرمانی هستند که روی پوسته Bash کار میکنند، نه برنامه ترمینال.
۱. ایجاد نامهای مستعار سفارشی برای دستورات مکرر
آیا از تایپ مداوم یک دستور طولانی خسته شدهاید؟ یا دستوراتی دارید که روزانه دهها بار تایپ میکنید؟ در این صورت، باید از نامهای مستعار (aliases) استفاده کنید. با aliases، نیازی به تایپ کل دستور نیست، فقط نام مستعار کوتاه و بهیادماندنی خود را تایپ میکنید.
برای مثال، بهجای اجرای git status هر بار، میتوانید یک نام مستعار مانند gs یا هر میانبر دیگری بر اساس ترجیح خود بسازید. میتوانید aliases را بهصورت موقت برای جلسه فعلی یا دائمی ایجاد کنید.
برای ایجاد یک نام مستعار موقت برای جلسه فعلی، از دستور alias به این صورت استفاده کنید:
alias gs="git status"
حالا، فقط gs را تایپ کنید، و Bash دستور git status را برای شما اجرا میکند. به همین سادگی. میتوانید هر تعداد نام مستعار که میخواهید اضافه کنید، اما جادوی واقعی زمانی اتفاق میافتد که این aliases را دائمی کنید.
فایل پیکربندی Bash خود (معمولاً ~/.bashrc یا ~/.bash_profile) را با ویرایشگر مورد علاقهتان، مانند nano، باز کنید:
sudo nano ~/.bashrc
سپس، دستورات نام مستعار خود را در انتهای فایل اضافه کنید.
فایل را ذخیره کنید، ترمینال را ریستارت کنید یا دستور زیر را اجرا کنید:
sudo source ~/.bashrc
حالا هر بار که ترمینال را باز کنید، این aliases در دسترس خواهند بود. من برای همه چیز، بهویژه برای دستورات بهروزرسانی و آپدیت، aliases دارم:
alias update='sudo apt update && sudo apt upgrade -y'
حالا، بهجای تایپ دستور کامل، فقط update را تایپ میکنم و بقیه کار انجام میشود. همچنین، میتوانید با استفاده از توابع، aliases با پارامترها بسازید:
mkcd() { mkdir -p "$1" && cd "$1" }
حالا، mkcd projects/new-app دایرکتوری را ایجاد میکند و فوراً به آن میرود. فقط مطمئن شوید که دستورات داخلی را بازنویسی نمیکنید، وگرنه خودتان را گیج خواهید کرد.
۲. جستجو در تاریخچه دستورات بهصورت فوری
پیمایش در تاریخچه ترمینال با کلید پیکان بالا میتواند زمانبر باشد. میدانید که دستور در آنجا هست، اما برای رسیدن به آن باید بارها کلید را فشار دهید. خوشبختانه، Bash یک جستجوی داخلی دارد که این کار را آسان میکند.
فقط Ctrl + R را در ترمینال فشار دهید. پرامپت شما تغییر میکند و میتوانید بخشی از دستور مورد نظر را تایپ کنید. با تایپ، Bash فوراً جدیدترین تطابق از تاریخچه شما را نشان میدهد.
بهعنوان جایگزین، این قطعه را به فایل ~/.inputrc (اگر وجود ندارد، آن را ایجاد کنید) اضافه کنید:
"\e[A": history-search-backward
"\e[B": history-search-forward
set show-all-if-ambiguous on
set completion-ignore-case on
ترمینال را ریلود کنید. حالا میتوانید چند کاراکتر تایپ کنید و از کلیدهای بالا/پایین برای جستجوی دستوراتی که با کاراکترهای تایپشده شروع میشوند استفاده کنید. برای مثال، اگر cd / را تایپ کنید و کلید بالا را فشار دهید، تاریخچه شما برای دستوراتی که با cd / شروع میشوند جستجو میشود.
۳. زنجیره کردن دستورات با استفاده از Pipelines و Redirection
یکی دیگر از قابلیتهای عالی Bash این است که میتوانید دستورات را زنجیره کنید. بهجای اجرای دستورات یکییکی، میتوانید آنها را متصل کنید تا خروجی یکی، ورودی دیگری شود. این کار با عملگر |) Pipelines) انجام میشود.
برای مثال، اگر میخواهید فقط فرآیندهای در حال اجرای مرتبط با Python را ببینید، نیازی به استفاده از دو دستور جداگانه نیست. در عوض، میتوانید آنها را زنجیره کنید:
ps aux | grep python
در اینجا، ps aux تمام فرآیندهای در حال اجرا را فهرست میکند و grep python لیست را فیلتر میکند تا فقط موارد مرتبط با Python را نشان دهد. همچنین، میتوانید بیش از دو دستور را زنجیره کنید تا one-linerهای سریع بسازید، مانند این:
cat logfile.txt | grep "error" | wc -l
این تعداد خطوط خطا در یک فایل لاگ را میشمارد، سه دستور بهصورت یکپارچه با هم کار میکنند.
تغییر مسیر (redirection) ابزار ضروری دیگری است. بهجای چاپ خروجی روی صفحه، میتوانید آن را به فایل بفرستید. برای مثال، اگر بخواهید فهرست دایرکتوری را در فایل ذخیره کنید:
ls -l > files.txt
میتوانید از >> بهجای > استفاده کنید اگر بخواهید بهجای بازنویسی، اضافه کنید. تغییر مسیر بهویژه برای لاگها، پشتیبانها، یا هر زمان که بخواهید نتایج را برای بعداً ذخیره کنید، مفید است.
۴. ارسال هر دستور در حال اجرا به پسزمینه
فرض کنید چیزی را اجرا کردهاید که زمان زیادی طول میکشد، مانند انتقال فایل بزرگ یا یک کار طولانی، و ترمینال شما گیر کرده است. بهجای باز کردن پنجره جدید، میتوانید آن را به پسزمینه بفرستید.
برای مثال، اگر چیزی در حال اجرا است، Ctrl + Z را فشار دهید. این کار آن را متوقف میکند و شما را به پرامپت پوسته برمیگرداند. سپس تایپ کنید:
bg
این کار آن را در پسزمینه از سر میگیرد، بنابراین ادامه مییابد در حالی که شما کارهای دیگر انجام میدهید. اگر بخواهید ببینید کدام کارها در حال اجرا یا متوقف هستند، از این استفاده کنید:
jobs
میتوانید یکی را به پیشزمینه برگردانید با:
fg %1
شماره کار را استفاده کنید؛ اگر آن را حذف کنید، fg جدیدترین را انتخاب میکند. همچنین، میتوانید دستور را از ابتدا در پسزمینه با افزودن & شروع کنید:
some_long_task &
به این ترتیب شما پرامپت را فوراً دریافت میکنید. یک ترفند دیگر: اگر نگران هستید که کار با بستن ترمینال متوقف شود، میتوانید اجرا کنید:
disown -h %job
این دستور Bash کد “do not hangup” (SIGHUP) را به آن کار میفرستد وقتی پوسته شما خارج میشود. یا از nohup در شروع استفاده کنید. به یاد داشته باشید: کارهای پسزمینه هنوز میتوانند خروجی به صفحه شما بنویسند، و همه دستورات دوست ندارند در پسزمینه باشند. در صورت نیاز از تغییر مسیر یا nohup استفاده کنید.
۵. اجرای مجدد دستور قبلی با امتیازات root (sudo !!)
این یکی در یک سناریوی خاص بسیار مفید است. !! (bang-bang) دستور قبلی را بهطور کامل فراخوانی میکند. شاید به نظر مفید نیاید، اما وقتی به دفعاتی که دستوری را تایپ میکنید که نیاز به امتیازات superuser دارد فکر کنید، متوجه کاربرد آن میشوید.
یک مثال عالی نصب اسکریپتهاست. فرض کنید یک اسکریپت نصب را با ./SCRIPT-NAME.sh اجرا میکنید و میگوید نیاز به امتیازات superuser دارید. فقط sudo !! را تایپ کنید، رمز عبور خود را وارد کنید، و تمام. این کار زمان زیادی صرفهجویی میکند و وقتی این توالی در حافظه شما جا بیفتد، سریعتر از زمانی که اشتباه میکردید آن را انجام خواهید داد.
۶. اجرای چندین دستور بهطور همزمان
گاهی اوقات نمیخواهید بنشینید و یک به یک دستورات را تایپ کنید. Bash به شما امکان میدهد آنها را زنجیره کنید تا یکی پس از دیگری بدون انتظار شما اجرا شوند. اگر بخواهید همه به ترتیب اجرا شوند، میتوانید دستورات را با سمیکالن (;) جدا کنید:
mkdir newdir; cd newdir; touch file.txt
اگر فقط بخواهید دستور دوم وقتی اولی موفق شد اجرا شود، از && استفاده کنید:
sudo apt update && sudo apt upgrade
از طرف دیگر، میتوانید از || برای اجرای چیزی فقط در صورت شکست دستور اول استفاده کنید:
backup_database || echo "Backup failed!"
شما محدود به دستورات متوالی نیستید. یک ampersand در انتها اضافه کنید و دستور در پسزمینه اجرا میشود و ترمینال شما را آزاد میکند. برای مثال، میتوانید چندین اپلیکیشن را مستقیماً از ترمینال باز کنید:
python script.py & firefox &
این اسکریپت پایتون شما را اجرا میکند و فایرفاکس را همزمان باز میکند. وقتی با زنجیرهسازی، کارهای پسزمینه، و کمی جایگزینی فرآیند آشنا شوید، دیگر دستورات را بهعنوان گامهای تکی نمیبینید و شروع به دیدن آنها بهعنوان بلوکهای ساختمانی میکنید که میتوانید به جریانهای کاری بزرگتر متصل کنید.
۷. یافتن دستورات با Apropos
Apropos دستوری است که به شما امکان میدهد دستورات با ورودیهای man یا دستی را بر اساس توضیحاتشان پیدا کنید. اگر تا به حال صفحه man یک دستور را دیده باشید، بخش NAME در بالا همان چیزی است که دربارهاش صحبت میکنم.
اگر بخواهم دستور ping را با apropos پیدا کنم، apropos icmp را در ترمینالم تایپ میکنم و Enter را میزنم. توجه کنید که حساس به حروف نیست. این کار هر دستوری با ورودی NAME که شامل “ICMP” باشد را نمایش میدهد.
یک استفاده عالی دیگر برای apropos، کاوش ابزارهایی است که ممکن است با آنها آشنا نباشید، مانند selinux. اجرای apropos selinux فهرستی از تمام دستورات مختلف برای تعامل با SELinux به شما میدهد و شما را در مسیر اجرای مؤثر قرار میدهد.
۸. جایگزینی در دستور قبلی
چیزی که در ترمینال زمان زیادی برایم صرفهجویی کرده، یادگیری نحوه جایگزینی چیزی در دستور قبلی است. اگر چیزی را اشتباه تایپ کنم یا نیاز به جایگزینی یک گزینه در دستور قبلی داشته باشم، میتوانم از کلید ^ برای فراخوانی کلمهای که اشتباه تایپ کردهام و سپس ^ دیگری برای قرار دادن کلمه یا گزینهای که میخواستم استفاده کنم.
بیایید یک مثال ببینیم. فرض کنید میخواهم bytegate.io را ping کنم تا مطمئن شوم اتصال اینترنت کامل (شامل DNS) دارم. اما اگر چیزی را اشتباه تایپ کنم، ممکن است خطایی دریافت کنم. اگر بهطور تصادفی bytegate.o (بدون “i”) را ping کنم، مشکلاتی خواهم داشت.
برای جایگزینی گزینه اشتباه تایپشده، میتوانم تایپ کنم:
^bytegate.o^bytegate.io
و دستور بهصورت مورد انتظار اجرا میشود. این یک مثال ساده است، اما فرض کنید دستور طولانی با گزینههای زیادی اجرا میکنید یا خروجی یا خطاها را اشتباه هدایت میکنید. امکان جایگزینی > با >> در یک دستور پیچیده نجاتدهنده است.
مثال دیگر با systemd و دستور systemctl است. من اغلب چندین زیرفرمان مختلف systemctl مانند start، stop، enable، یا disable را اجرا میکنم. میتوانم آنها را با ^start^enable جایگزین کنم که زمانم را صرفهجویی میکند.
۹. انتقال آرگومانها از دستورات قبلی
با استفاده از !$، میتوانیم آخرین آرگومان یک دستور را به دستور فعلی منتقل کنیم و با تغییرات جزئی، میتوانیم هر یک از آرگومانها را به دستور فعلی منتقل کنیم.
بیایید چند مثال ببینیم. اگر در حال ویرایش یک اسکریپت باشم، ممکن است دستور nano samplescript.sh را استفاده کنم. پس از اتمام کار با اسکریپت، میخواهم آن را اجرایی کنم، بنابراین ممکن است مجوزهای اکتال را به ۷۵۵ تغییر دهم. برای این کار، میتوانم از chmod 755 !$ استفاده کنم. سپس، برای دوباره فراخوانی نام اسکریپت، میتوانم از ./!:۲ برای فراخوانی دومین آرگومان استفاده کنم.
چند مثال دیگر:
!^– اولین آرگومان!*– همه آرگومانها!:۲-$– دومین تا آخرین آرگومان!:۲-۴– دومین تا چهارمین آرگومان
میتوانید شمارهها را جایگزین کنید تا هر آرگومانی که میخواهید فراخوانی کنید. Bash نزدیک به ۱۰۰ آرگومان را با این روش در دسترس نگه میدارد و میتوانید بهراحتی کارهای تکراری را سریع انجام دهید.
امیدواریم این نکات و ترفندهای Bash به شما کمک کند تا در ترمینال هوشمندانهتر کار کنید.
بیشتر بخوانید:
نحوه باز کردن فایلها و پوشهها به وسیله CMD در ویندوز
دستور dir در خط فرمان (CMD) چیست؟
آپدیت سریع تمام برنامه ها در ویندوز با winget از طریق خط فرمان










