ترفندهای Bash
کار با تاریخچه
bash یک تاریخچه از تمامی فرمانهایی که تا کنون تایپ کردهاید نگاه میدارد. که با استفاده از آنها میتوانید به سرعت کار خود بیافزایید.
برای اجرای آخرین فرمان کافی است دو علامت تعجب (!!) تایپ کنید. همچنین برای اجرای آخرین فرمانی که با کلمهی خاصی شروع میشود (مثلا vi) میتوانید از این دستور استفاده کنید:
$ !vi
برای تکمیل خودکار یک دستور با استفاده از تاریخچه، چند حرف اول آن را نوشته و سپس کلیدهای CTRL و R را بفشارید. در مثال قبلی میتوانستید دو حرف vi را تایپ کرده و سپس با فشردن کلیدهای CTRL و R آخرین دستوری که در تاریخچه موجود است و با vi شروع میشود، در خط فرمان قرار خواهد گرفت. با فشردن چندین بارهی این دو کلید میتوانید میان یافتههای موجود در تاریخچه بگردید.
فرض کنید همچنین چیزی نوشتهاید:
$ ls /long/path/to/a/file
حال میخواهید همین فایل را در جایی دیگر کپی کنید. کافی است بنویسید:
$ cp !$ /another/location/
آخرین پارامتر آخرین دستور جایگزین $! خواهد شد. علاوه بر این، میتوانید با فشردن کلیدهای ESC و نقطه (period) پارامترهای دستورهای قبل را در مکان جاری cursor قرار دهید. با فشردن چندبارهی این دو کلید میتوانید میان پارامترهای تایپ شده تاکنون بگردید. (نکته: در خط فرمان، ترکیب کلیدهای CTRL+[ معادل کلید ESC است.)
البته در اغلب ترمینالها، ترکیب دو کلید ALT و نقطه نیز میتواند پارامترهای موجود در تاریخچه را به شما بدهد.
با استفاده از دستور زیر میتوانید به دایرکتوریای که پیش از این در آن بودید برگردید:
$ cd -
کلیدهای میانبر
اگر تا به حال با ویرایشگر قدرتمند Emacs کار کرده باشید، حتما با میانبرهای آن آشنا هستید. این میانبرها به شما امکان میدهند که بدون برداشتن دست از موقعیت استاندارد تایپ، تمامی دستورات Emacs را اجرا کنید. جالب است بدانید که میتوان از این میانبرها در bash نیز استفاده نمود!
به عنوان مثال، کلیدهای CTRL+E شما را به انتهای خط، و CTRL+A به ابتدای خط منتقل خواهد نمود. با فشردن CTR+F یک کرکتر به سمت جلو، CTRL+B به سمت عقب، CTRL+P بالا (دستور قبلی در تاریخچه) CTRL+N به سمت پایین خواهید رفت. فشردن CTRL+D عملکرد کلید Delete را دارد، ALT+D کلمهی جلوی cursor را پاک میکند، و CTRL+W کلمهی قبل از cursor را.
برای cut کردن یک خط، از CTRL+K (حرف اول Kill) استفاده کنید. سپس برای paste کردن آن ترکیب CTRL+Y را به کار گیرید. برای کپی یا cut یک قسمت از متن، ابتدا باید آن را علامت بگذارید. برای این کار به ابتدای متن مورد نظر رفته و کلیدهای CTRL+SPACE را بفشارید. حال به انتهای متن رفته، و میتوانید با استفاده از ALT+U متن را کپی، و با استفاده از CTRL+U آن را cut کنید. همانند قبل، CTRL+Y متن را paste میکند. بعد از یک بار فشردن CTRL+Y میتوانید با استفاده از ترکیب ALT+Y به متنهایی که پیش از این کپی کرده بودید دست یابید.
یک خبر خوشحال کننده برای حرفهایهای vi: میتوانید با استفاده از دستور زیر:
$ set -o vi
از دستورات vi درون شل استفاده کنید. درست همانند vi فشردن ESC شما را به command mode برده، و میتوانید به عنوان مثال با استفاده از صفر به ابتدای خط بروید، از کلیدهای H J K L استفاده کنید، و بسیاری میانبرهای دیگر که خودتان بهتر میدانید!
هدایت ورودی خروجی
همهی ما میدانیم چطور میشود خروجی یک دستور را درون یک فایل ذخیره کرد:
$ ps axjf > filename
این دستور فایل را پاک کرده، و محتویات خروجی دستور را درون آن قرار میدهد. اما اگر بخواهیم خروجی دستور را در ادامهی فایل بنویسیم: (append)
$ ps axjf >> filename
برای هدایت کردن خروجی stderr (خطاها)به همراه خروجی استاندارد به یک فایل یا دستور:
$ make 2>&1 | less
دستور 2>&1 به bash میگوید که خروجی خطاها (stderr) را به خروجی استاندارد (stdout) هدایت کن. کرکتر & پیش از عدد یک به bash میگوید که منظور اسم فایل نیست، بلکه stream شماره ۱ (خروجی استاندارد) است. حال که هر دوی اینها در یک جا نوشته میشوند، میتوانیم از دوستمان pipe کمک بگیریم که خروجی را به دستور دیگری بدهد.
اما ارسال خروجی استاندارد و خطا به یک فایل، کمی عجیب است:
$ ps axjf > filename 2>&1
اگر bash این خط را از چپ به راست اجرا میکند، دستور 2>&1 نباید اول بیاید؟ اگر دستور قبل را به این صورت مینوشتیم، عمل نمیکرد:
$ ps axjf 2>&1 > filename
bash این دستور را به این صورت اجرا خواهد کرد: ابتدا خروجی خطا به خروجی استاندارد هدایت خواهد شد. تا اینجا، خروجی استاندارد روی ترمینال نوشته میشد، پس خروجی خطا نیز همانجا نوشته خواهد شد. سپس به bash میگوییم که خروجی استاندارد را به فایل ارسال کند. اما خروجی خطا همچنان در ترمینال نوشته میشود، چرا که خروجی استاندارد نمیتواند روی آن تاثیر بگذارد.
اما در فرمان اول، ابتدا خروجی استاندارد را به فایل هدایت میکنیم. از این پس هرچه در خروجی استاندارد نوشته شود، در فایل ذخیره خواهد شد. حال خروجی خطا را به همان جایی ارسال میکنیم که خروجی استاندارد نوشته میشد: فایل.
حال که متوجه شدیم هدایت خروجیها چگونه عمل میکنند، میتوانیم استفادههای زیادی از آن ببریم. به عنوان مثال اگر تنها بخواهیم خروجی خطاها را ببینیم:
$ make 2>&1 > /dev/null | less
ترفندهای دیگر
برای گرفتن یک کپی پشتیبان از یک فایل:
$ cp /etc/httpd/conf/httpd.conf{,.bak}
یا برای ساخت چند دایرکتوری به نامهای pkg01، pkg02 و … تا pkg20:
$ mkdir pkg{01..20}
به صورت پیش فرض، کلیدهای CTRL+D (کرکتر انتهای فایل) شما را از شل logout میکند. گاهی مواقع این مورد آزار دهنده است. مثلا هنگامی که در حال کار با telnet هستید، و برای خروج چندین بار CTRL+D را میفشارید، که ممکن است منجر به خروج اتفاقی از شل شود. برای غیرفعال کردن این حالت، میتوانید از دستور زیر استفاده کنید:
$ set -o ignoreeof
اگر بخواهید یک فایل را غیر قابل تغییر سازید، به طوری که حتی کابر ریشه هم قادر به تغییر آن نباشد:
$ chattr +i filename
و برای برگرداندن آن:
$ chattr -i filename
در صورتی که میخواهید در میان راهنماها (man pages) جستجو کنید، دستور apropos به شما کمک خواهد کرد. معمولا این دستور هنگامی مفید است که به دنبال برنامهای میگردید که میدانید چه کار میکند، اما ناماش را نمیدانید. به عنوان مثال:
$ apropos zip
البته این دستور پارامترهای زیادی قبول میکند. به عنوان نمونه، میتوانید با استفاده از r- جستجو را بر اساس regular expression انجام دهید.