چگونه از دستورات تاریخچه و گسترش های Bash در یک سرور لینوکسی استفاده کنیم؟
۷ فروردین ۱۴۰۴
در حین کار در یک محیط سرور، زمان زیادی را در خط فرمان خواهید گذراند. احتمالا از شل باش (bash) استفاده خواهید کرد که پیشفرض بیشتر توزیعها است.
در طول یک جلسه ترمینال، احتمالا برخی دستورات را مکررا تکرار خواهید کرد و نسخههای مختلفی از آن دستورات را حتی بیشتر از قبل تایپ خواهید کرد. درحالی که تایپ هر دستور به صورت مکرر در ابتدا میتواند تمرین خوبی باشد، در یک مقطع زمانی، این کار به یک مزاحمت و کلافگی تبدیل میشود.
خوشبختانه، شل باش تعدادی قابلیت تاریخچه نسبتا خوب توسعه یافته دارد. یادگیری نحوه استفاده موثر و دستکاری تاریخچه باش به شما این امکان را میدهد که زمان کمتری را صرف تایپ کردن کنید و زمان بیشتری را صرف انجام کار واقعی نمایید. بسیاری از توسعه دهندگان با فلسفه DRY آشنا هستند. استفاده موثر از تاریخچه باش به شما این امکان را میدهد که به این اصل نزدیکتر شوید و جریان کار خود را سریعتر کنید.
در ادامه خواهید خواند:
- پیش نیازها
- تنظیم پیشفرض های تاریخچه
- بررسی تاریخچه قبلی Bash
- اجرای دستورات از تاریخچه Bash
- پیمایش در تاریخچه Bash
- جستجو در تاریخچه Bash
- آشنایی با گسترش تاریخچه پیشرفتهتر
- جمع بندی
پیش نیازها
برای دنبال کردن این راهنما، به یک کامپیوتر با سیستم عامل مبتنی بر لینوکس نیاز دارید. این میتواند یک سرور خصوصی مجازی باشد که از طریق SSH به آن متصل شدهاید، یا ماشین محلی شما باشد. اگر قصد دارید از این راهنما استفاده کنید، به شما توصیه میشود ابتدا راهنمای سرور مجازی ابری را بررسی کنید. این کار به شما این امکان را میدهد تا با تنظیمات استاندارد مانند دسترسی sudo برای کاربران غیر روت و فایروال پیکربندی شده، محیط سروری امن و پایدار راهاندازی کنید که به شما این اجازه را میدهد تا بهطور مؤثرتر از سرور خود استفاده کرده و مهارتهای لینوکسی خود را تقویت کنید.

تنظیم پیشفرض های تاریخچه
قبل از این که شروع به استفاده از تاریخچه دستورات خود کنید، میتواند مفید باشد که برخی ز تنظیمات bash را تغییر دهید تا استفاده از آن راحت تر شود. این مراحل ضروری نیستند، اما میتوانند یافتن و اجرای دستورات قبلی را آسانتر کنند.
Bash به شما این امکان را میدهد که تعداد دستورات ذخیره شده در تاریخچه را تنظیم کنید. در واقع، دو گزینه جداگانه برای این کار وجود دارد: پارامتر HISTFILESIZE
تعداد دستورات ذخیره شده در فایل تاریخچه را پیکربندی میکند، درحالی که HISTSIZE
تعداد دستورات ذخیره شده در حافظه را برای جلسه جاری را کنترل میکند.
این بدان معنا است که میتوانید یک محدودیت معقول برای اندازه تاریخچه در حافظه برای جلسه جاری تعیین کنید و تاریخچه بزرگتری را برای ذخیرهسازی در دیسک داشته باشید که میتوانید بعدا آن را بررسی کنید. به صورت پیشفرض، bash مقادیر بسیار محافظه کارانهای برای این گزینهها تنظیم میکند، اما شما میتوانید آنها را افزایش دهید تا از تاریخچه بزرگتر استفاده کنید. برخی از توزیعها به صورت پیشفرض تنظیمات تاریخچه bash را با مقادیر کمی سخاوتمندانهتر افزایش داده اند.
برای تغییر این تنظیمات، فایل ~/.bashrc
خود را با ویرایشگر متن مورد نظر خود باز کنید. در اینجا، ما از nano
استفاده کرده ایم.
nano ~/.bashrc
برای پارمترهای HISTSIZE
و HISTFILESIZE
جستجو کنید. اگر تنظیم شده اند، میتوانید مقادیر آنها را تغییر دهید. اگر این پرامترها در فایل شما وجود ندارند، حالا میتوانید آنها را اضافهکنید. برای اهداف این راهنما، ذخیره 10000 خط در دیسک و بارگذاری 5000 خط در حافظه خوب کار میکند. این یک تخمین محافظهکارانه برای اگثر سیستمها است، اما اگر تاثیر منفی بر عملکرد مشاهده کردید، میتوانید این اعداد را کاهش دهید.
. . .
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=5000
HISTFILESIZE=10000
. . .
به صورت پیشفرض، bash تاریخچه خود را در انتهای هر جلسه مینویسد و فایل موجود را با نسخه بهروز شده جایگزین میکند. این بدان معنا است که اگر شما در حال ورود به چندین جلسه bash باشید، تنها آخرین جلسهای که بسته میشود، تاریخچه آن ذخیره خواهد شد.
شما میتوانید با تنظیم گزینه histappend که تاریخچه را به جای جایگزینی زمینه میکند، این مشکل را حل کنید. این گزینه ممکن است قبلا تنظیم شده باشد، اما اگر نیست، میتوانید آن را با اضافه کردن این خط فعال کنید.
. . .
shopt -s histappend
. . .
اگر میخواهید bash بلافاصله دستورات را به تاریخچه شما اضافه کند، بهجای این که تا انتهای هر جلسه صبر کند (به این معنی که دستورات در یک ترمینال فوراً در ترمینال دیگر فایل دسترسی باشند)، میتوانید دستور history -a
را به پارامتر PROMPT_COMMAND
اضافه کنید که شامل دستورات اجرایی قبل از هر درخواست فرمان جدید است.
برای تنظیم صحیح این مورد، شما باید PROMPT_COMMAND
bash را سفارشی کنید تا نحوه ثبت دستورات در فایل تاریخچه و حافظه جلسه جاری را تغییر دهید:
ابتدا باید تاریخچه را فوراً با دستور history -a
به فایل تاریخچه اضافه کنید.
بعد، باید تاریخچه جاری در جلسه shell خود را با دستور history -c
پاک کنید.
در نهایت، برای بارگذاری تاریخچه بهروز شده به جلسه shell خود، از دستور history -r
استفاده کنید.
قرار دادن همه این دستورات به ترتیب در متغیر shell PROMPT_COMMAND
منجر به کد زیر میشود که میتوانید آن را در فایل ~/.bashrc
خود قرار دهید.
. . .
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
. . .
هنگامی که تمام شد، فایل را ذخیره کرده و خارج شوید. اگر با nano فایل ~/.bashrc
خود را ویرایش کردهاید، این کار را با فشار دادن CTRL + X
، Y
، و سپس ENTER
انجام دهید.
برای پیادهسازی تغییرات خود، یا از سیستم خارج شوید و دوباره وارد شوید، یا فایل را با دستور زیر بارگذاری کنید.
source ~/.bashrc
با این کار نحوهی مدیریت تاریخچه دستورات شما توسط sell تنظیم شده است. حالا میتوانید تمرین کنید که چگونه دستورات قبلی خود را با دستور history
پیدا کنید.
با سرور اوبونتو لیارا، سرور خود را با هزینه بهصرفه و بالاترین کارایی مدیریت کنید.
استقرار سریع | منابع بهینه | امنیت پیشرفته
خرید سرور اوبونتو لیارا
بررسی تاریخچه قبلی Bash
راه بررسی تاریخچه دستورات bash استفاده از دستور history
است. این دستور، دستورات اخیر شما را چاپ میکند، به صورتی که هر دستور در یک خط نمایش داده میشوند. این خروجی باید در نهایت تعداد خطوطی باشد که برای متغیر HISTSIZE
انتخاب کردهاید. احتمالا در این مرحله کمتر از آن تعداد خواهد بود.
history
Output
. . .
43 man bash
44 man fc
45 man bash
46 fc -l -10
47 history
48 ls -a
49 vim .bash_history
50 history
51 man history
52 history 10
53 history
هر دستوری که در تاریخچه برمیگردد، با یک شماره برای مرجع آسانتر همراه است. این راهنما در ادامه توضیح خواهد داد که چگونه این شمارهها میتوانند مفید باشند.
شما میتوانید خروجی را با مشخص کردن یک عدد بعد از دستور محدود کنید. به عنوان مثال، اگر بخواهید فقط 5 دستور آخر که اجرا کردهاید را برگردانید، میتوانید از این دستور استفاده کنید.
history 5
Output
50 history
51 man history
52 history 10
53 history
54 history 5
برای پیدا کردن تمام دستورات تاریخچهه که شامل رشته خاص هستند، میتوانید نتایج را با استفاده از دستور grep
به یک دستور جستجو تبدیل کنید که هر خط را برای رشته دادهشده جستجو میکند. به عنوان مثال، میتوانید خطوطی که شامل cd
هستند را جستجو کنید با تایپ کردن این دستور.
history | grep cd
Output
33 cd Pictures/
37 cd ..
39 cd Desktop/
61 cd /usr/bin/
68 cd
83 cd /etc/
86 cd resolvconf/
90 cd resolv.conf.d/
در بسیاری از موقعیتها، این که بتوانید فهرستی از دستورات قبلی که اجرا کردهابد را بازیابی کنید، میتواند مفید باشد. اگر بخواهید یکی از دستورات را دوباره اجرا کنید، ممکن است به صورت غریزی یکی از دستورات را از خروجی خود کپی کرده . آن را در ترمینال خود پیست کنید. این کار جواب میدهد، اما bash چنین میانبر دارد که به شما این امکان را میدهد که دستورات را از تاریخچه بازیابی کرده و به صورت خودکار اجرا کنید.
با سرور مجازی ابری لیارا، بدون دردسر زیرساخت، کسبوکار خود را رشد دهید!
پایدار | پرسرعت | اقتصادی
خرید سرور مجازی ابری لیارا
اجرای دستورات از تاریخچه Bash
چاپ تاریخچه دستورات شما میتوانید مفید باشد، اما در واقع به شما کمک نمیکند تا این دستورات را به جز به عنوان مرجع دسترسی پیدا کنید.
شما میتوانید هر کدام از دستورات برگشتی از عملیات تاریخچه را با استفاده از شماره آن دستور، که با یک علامت تعجب (!
) پیش از آن قرار دارد، فراخوانی و بلافاصله اجرا کنید. فرض کنید نتایج تاریخچه شما با آنچه در بخش قبلی گفته شد، هم راستا باشد. در این صورت، شما میتوانید صفحه راهنمای دستور history
را به سرعت با تایپ کردن دستور زیر مشاهده کنید.
!51
این دستور بلافاصله دستور مربوط به شماره تاریخچه 51 را فراخوانی و اجرا خواهد کرد.
همچنین میتوانید دستورات را نسبت به موقعیت فعلی خود با استفاده از نحوه !-n
اجرا کنید، جایی که “n” با تعداد دستورات قبلی که میخواهید بازیابی کنید جایگزین میشود.
برای مثال، فرض کنید دو دستور زیر را اجرا کردهاید.
ls /usr/share/common-licenses
echo hello
اگر بخواهید دستور قبلی از آخرین دستور خود اجرا کردهاید (دستور ls
) فراخوانی و اجرا کنید، میتوانید دستور زیر را تایپ کنید.
!-2
برای دوباره اجرا کردن آخرین دستوری که اجرا کردهاید، میتوانید !-1
را وارد کنید. با این حال، bash یک میانبر با استفاده از دو علامت تعجب فراهم میآورد که دستورات اخیر را جایگزین کرده و آن را اجرا میکند.
!!
بسیاری از افراد از این میانبر زمانی استفاده میکنند که دستوری را تایپ کردهاند ولی فراموش کردهاند که نیاز به دسترسی sudo
برای اجرای آن دارند. تایپ کردن sudo !!
دستور را با sudo
در ابتدای آن دوباره اجرا میکند.
touch /etc/hello
Output
touch: cannot touch `/etc/hello': Permission denied
sudo !!
Output
sudo touch /etc/hello
[sudo] password for sammy:
این نشان میدهد که ویژگی دیگری از این نحو وجود دارد: این میانبرها به صورت خالص جایگزین میشوند و میتوانند در داخل دستورات دیگر به دلخواه گنجانده شوند.
پیمایش در تاریخچه Bash
روشهای مختلفی برای مرور تاریخچه bash وجود دارد که هر دستور را به ترتیب وارد خط فرمان برای ویرایش قرار میدهد.
رایجترین روش این است که کلید پیکان بالا را در خط فرمان فشار دهید. هر بار که کلید پیکان بالا را فشار دهید، شما را به دستورهای قدیمیتر در تاریخچه خط فرمان هدایت میکند.
اگر نیاز دارید که به سمت دیگر بروید، کلید پیکان پایین تاریخچه را در جهت معکوس پیمایش میکند و در نهایت شما را به خط فرمان خالی فعلی برمیگرداند.
اگر جابجایی دستتان به سمت کلیدهای پیکان برایتان مشکل است، میتوانید از ترکیب CTRL + P
برای حرکت به عقب در تاریخچه دستورات و از ترکیب CTRL + N
برای حرکت به جلو استفاده کنید.
اگر میخواهید به خط فرمان فعلی بازگردید، میتوانید این کار را با فشار دادن META + >
انجام دهید. در بیشتر موارد، کلید “متا” همان کلید ALT
است، بنابراین META + >
به معنی فشردن ALT + SHIFT + .
است. این مفید است اگر در تاریخچه خود خیلی عقب رفتهاید و میخواهید به خط فرمان خالی خود بازگردید.
همچنین میتوانید با انجام عکس این حرکت و فشار دادن META + <
به اولین خط تاریخچه خود بروید. این معمولاً به معنی فشار دادن ALT + SHIFT + ,
است.
برای خلاصه کردن، اینها برخی از کلیدها و ترکیبهای کلیدی هستند که میتوانید برای پیمایش در تاریخچه و رفتن به هر دو انتهای آن استفاده کنید:
- کلید پیکان بالا: پیمایش به عقب در تاریخچه
CTRL + P
: پیمایش به عقب در تاریخچه- کلید پیکان پایین: پیمایش به جلو در تاریخچه
CTRL + N
: پیمایش به جلو در تاریخچهALT + SHIFT + .
: رفتن به انتهای تاریخچه (آخرین دستور)ALT + SHIFT + ,
: رفتن به ابتدای تاریخچه (دورترین دستور)
جستجو در تاریخچه Bash
اگر چه استفاده از دستور history
با دستور grep
میتواند روشی مفید برای محدود کردن نتایج باشد، اما در بسیاری از مواقع ایدهآل نیست.
Bash قابلیت جستجو برای تاریخچه خود را شامل میشود. روش معمول استفاده از این قابلیت، جستجو در تاریخچه به صورت معکوس (نتایج اخیر اول نمایش داده میشوند) با استفاده از ترکیب کلیدهای CTRL + R
است.
به عنوان مثال، شما میتوانید CTRL + R
را فشار دهید و بخشی از دستور قبلی را تایپ کنید. شما تنها باید تنها بخشی از دستور را تایپ کنید. اگر دستور اشتباهی را پیدا کردید، میتوانید دوباره CTRL + R
را فشار دهید تا نتیجه بعدی را ببینید.
اگر به صورت تصادفی دستور مورد نظر خود را رد کردید، میتوایند با فشردن CTRL + S
در جهت معکوس حرکت کنید. این همچنین میتواند مفید باشد اگر با استفاده از کلیدهای بخش قبلی به نقطهای دیگر در تاریخچه رفتهاید و بخواهید جستجو را به جلو انجام دهید.
باید توجه داشته باشید که در بسیاری از ترمینالها، ترکیب کلید CTRL + S
به صورت پیشفرض برای تعلیق جلسه ترمینال تنظیم شده است. این باعث میشود که هرگونه تلاش برای ارسال CTRL + S
به bash مسدود شود و ترمینال شما فریز شود. برای رفع یخ زدگی، کافی است CTRL + Q
را فشار دهید تا جلسه ترمینال باز شود.
این ویژگی تعلیق و از سرگیری در بیشتر ترمینالهای مدرن نیاز نیست و شما میتوانید آن را بدون هیچ مشکلی با اجرای دستور زیر غیر فعال کنید.
stty -ixon
stty
یک ابزار است که به شما این امکان را میدهد تا تنظیمات ترمینال خود را از خط فرمان تغییر دهید. همچنین میتوانید این دستور stty -ixon
را به انتهای فایل ~/.bashrc
خود اضافه کنید تا این تغییر دائمی شود.
اگر اکنون دوباره با فشار دادن CTRL + S
جستجو کنید، باید به درستی کار کند و به شما امکان جستجو به جلو را بدهد.
جستجو بعد از تایپ بخش از دستور
یک سناریو رایج این است که شما بخشی از یک دستور را تایپ کردهاید و سپس متوجه میشوید که قبلا آن را اجرا کردهاید و میتوانید تاریخچه را برای آن جستجو کنید.
روش صحیح جستجو با استفاده از آنچه که قبلا در خط فرمان تایپ کردهاید، این است که ابتدا مکان نما خود را با استفاده از CTRL + A
به ابتدای خط ببرید، سپس دوباره با CTRL + R
جستجو در تاریخچه را ادامه دهید.
به عنوان مثال، فرض کنید که شما میخواهید کش بستههای خود را در یک سیستم اوبونتو بهروزرسانی کنید. شما قبلا این دستور را تایپ کردهاید اما تا زمانی که دوباره sudo
را در خط فرمان تایپ نکردید، به یاد نیاوردهاید که قبلا این کار را کرده اید.
sudo
در این لحظه، متوجه میشوید که این عملیاتی است که قطعا در روز یا روزهای گذشته انجام دادهاید. میتوانید با فشاردادن CTRL + A
مکان نما خود را به ابتدای خط ببرید. سپس با فشردن CTRL + R
جستجوی تاریخچه معکوس خود را فراخوانی کنید. این باعث میشود که تمام محتوای بعد از خط فرمان کپی شده و در کلیپبورد شما قرار گیرد.
سپس، با فشردن CTRL + Y
، قسمتهایی از دستور را که اخیرا در خط فرمان تایپ کردهاید را به جستجو وارد کنید. در نهایت، با فشار دادن دوباره CTRL + R به جستجو در تاریخچه ادامه دهید تا دستوری را پیدا کنید که شامل محتوای وارد شده شما باشد.
استفاده از این میانبرها شاید در ابتدا کمی وقت گیر به نظر برسد، اما وقتی به آن عادت کنید، میتوانید بسیار مفید باشد. این روش زمانی بسیار کمک کننده است که شما بخشی از یک دستور پیچیده را تایپ کرده این و میدانید که باید از تاریخچه برای تکمیل آن استفاده کنید.
به جای فکر کردن به این ترکیبهای کلیدی به عنوان ترکیبهای مجزا، شاید بهتر باشد که آنها را به عنوان یک عملیات مرکب در نظر بگیرید. شما میتوانید به سادگی کلید CTRL
را نگه دارید و به ترتیب A
, R
, Y
و سپس R
را فشار دهید.

آشنایی با گسترش تاریخچه پیشرفتهتر
این مقاله قبلا به برخی از تکنیکهای پایهای گسترش تاریخچه که توسط بش فراهم شده است پرداخته است. برخی از مواردی که تا به حال پوشش داده شده است عبارت هستند از مواردی که در ادامه ارائه شده اند.
!!
: گسترش به آخرین فرمان!n
: گسترش فرمان با شماره تاریخچه “n”. !-n
: گسترش به فرمانی که “n” فرمان قبل از فرمان فعلی در تاریخچه بوده است.
با هاست لینوکس لیارا، سایت خود را با سرعت بالا و امنیت تضمینشده راهاندازی کنید!
عملکرد عالی | پشتیبانی 24/7 | قیمت مقرون به صرفه | نصب آسان | مدیریت بدون دردسر
خرید هاست لینوکس لیارا
شناسههای رویداد
سه نمونهای که در بالا ذکر شد، نمونههایی از شناسههای رویداد هستند. اینها معمولا راههایی برای فراخوانی دستورات تاریخچه قبلی با استفاده از معیارهای خاص هستند. این بخش انتخابی از عملیاتهای موجود شما است.
برای مثال، شما میتوانید آخرین دستورssh
که اجرا کرده ای را با تایپ کردن دستور زیر اجرا کنید.
!ssh
این دستور به دنبال خطوطی در تاریخچه دستورات شما میگردد که با ssh
شروع میشوند. اگر بخواهید به دنبال یک رشته که در ابتدای دستور نباشد بگردید، میتوانید آن را با علامت های ؟
محاط کنید. برای مثال برای تکرار دستور قبلی apt-cache search
میتوانید از دستور زیر استفاده کنید تا آن را پیدا و اجرا کنید.
!?search?
شناسه رویداد دیگری که میتوانید امتحان کنید شامل جایگزین کردن یک رشته در دستور قبلی شما با دیگری است. برای انجام این کار، علامت caret (^) را وارد کنید، سپس رشتهای که میخواهید جایگزین کنید را بنویسید، بلافاصله بعد از آن caret دیگری، رشته جایگزین را وارد کنید و در انتها نیز یک caret دیگر قرار دهید. از وارد کردن فاصله بین رشتهها خودداری کنید مگر اینکه بخواهید آنها بخشی از رشته اصلی یا رشته جایگزین باشد.
^original^replacement^
این دستور دستور قبلی را فراخوانی میکند (دقیقاً مثل !!
)، به دنبال رشتهای به نام original
در داخل دستور میگردد و آن را با replacement
جایگزین میکند. سپس دستور را با استفاده از رشته جایگزین اجرا میکند.
این روش برای رفع اشتباهات تایپی بسیار مفید است. برای مثال، فرض کنید که به اشتباه دستور زیر را برای خواندن محتوای فایل /etc/hosts
اجرا کردهاید.
cat /etc/hosst
Output
cat: /etc/hosst: No such file or directory
به جای نوشتن مجدد دستور، میتوانید دستور زیر را اجرا کنید.
^hosst^hosts^
ابن دستور خطای موجود در دستور قبلی را اصلاح کرده و آن را با موفقیت اجرا میکند.
شناسههای کلمه
پس از شناسههای رویداد، میتوانید یک کولن (:
) دنبال شده توسط شناسه کلمه را وارد کنید تا بخشی از دستور مطابقت یافته را انتخاب کنید.
این کار با تقسیم دستور به کلمات انجام میشود که به هر بخشی از دستور اطلاق میشود که با فاصله ار هم جدا شده است. این امکان را به شما میدهد که به شکلی جالب با پارامترهای دستور خود تعامل داشته باشید.
شمارهگذاری کلمات از دستور اولیه با “0” شروع میشود، اولین آرگومان به عنوان “1” و از آنجا ادامه مییابد.
برای مثال، شما میتوانید محتوای یک دایرکتوری را فهرست کنید و سس تصمیم بگیرید که وارد همان دایرکتوری شوید. شما میتوانید این کار را با اجرای دستورات زیر به صورت پشت سر هم انجام دهید.
ls /usr/share/common-licenses
cd !!:1
در مواردی که شما روی دستور قبلی کار میکنید، میتوانید این را با حذف علامت ! دوم و همچنین کولن کوتاه کنید.
cd !1
این دستور به همان شیوه عمل میکند.
شما میتوانید به آرگومان اول با استفاده از (caret (^
و به آرگومان آخر با استفاده از علامت دلار ($
) ارجاع دهید، اگر این برای مقاصد شما منطقی باشد. این روشها زمانی مفیدتر هستند که از رنجها به جای شمارههای خاص استفاده کنید. برای مثال، شما سه روش دارید تا تمام آرگومانها از دستور قبلی را به دستور جدید وارد کنید.
!!:1*
!!:1-$
!!:*
علامت *
تنها به تمام بخشهای دستور فراخوانی شده غیر از دستور اولیه گسترش مییابد. به طور مشابه، میتوانید از یک شماره به همراه *
استفاده کنید تا به این معنی باشد که همه چیز بعد از کلمه مشخص شده باید گنجانده شود.
خرید سرور مجازی لینوکس با منابع اختصاصی و عملکرد بینظیر!
سرعت بالا | منابع اختصاصی | امنیت پیشرفته| قیمت مقرون به صرفه
خرید سرور مجازی لینوکس لیارا
اصلاح کننده ها
یکی دیگر از کارهایی که میتوانید برای تغییر رفتار خط تاریخچهای که فراخوانی میکنید انجام دهید، این است که رفتار فراخوانی را تغییر دهید تا خود متن دستورات را دستکاری کنید. برای انجام این کار، میتوانید اصلاحکنندهها را پس از کاراکتر کولن (:
) در انتهای گسترش وارد کنید.
برای مثال، شما میتوانید مسیر فایل را با استفاده از اصلاحکننده h
(که مخفف “head” است) قطع کنید، که مسیر را تا قبل از آخرین کاراکتر اسلش (/
) حذف میکند. توجه داشته باشید که این روش در صورتی که بخواهید یک مسیر دایرکتوری را که با یک اسلش انتهایی خاتمه مییابد کوتاه کنید، درست عمل نخواهد کرد.
یک کاربرد رایج این است که اگر شما در حال ویرایش یک فایل باشید و متوجه شوید که میخواهید به دایرکتوری فایل بروید تا عملیات دیگری روی فایلهای مرتبط انجام دهید.
برای مثال، فرض کنید این دستور را برای چاپ محتوای یک لایسنس نرمافزار متن باز اجرا میکنید.
cat /usr/share/common-licenses/Apache-2.0
بعد از اینکه مطمئن شدید لایسنس برای نیازهای شما مناسب است، ممکن است بخواهید وارد دایرکتوری شوید که این قایل در آن قرار دارد. شما میتوانید این کار را با فراخوانی دستور cd
بر روی زنجیره آرگومانها و قطع کردن نام فایل در انتها انجام دهید.
cd !!:$:h
اگر دستور pwd
را اجرا کنید، که دایرکتوری کاری فعلی شما را چاپ میکند، خواهید دید که وارد دایرکتوری مربوطه شدهاید.
pwd
Output
/usr/share/common-licenses
حالا که وارد دایرکتوری شدید، ممکن است بخواهید دوباره فایل لایسنس را بررسی کنید، این بار در یک صفحه نمایش مانند less
.
برای این کار، میتوانید برعکس عمل قبلی را انجام دهید و مسیر را قطع کرده و تنها از نام فایل با استفاده از اصلاح کننده t
(که مخفف tail است) استفاده کنید. شما میتوانید عملیات cat
قبلی خود را جستجو کرده و با استفاده از اصلاح کننده t
تنها نام فایل را به آن پاس کنید.
less !cat:$:t
شما به راحتی میتوانید مسیر کامل مطلق را نگه دارید و این دستور در اینجا به درستی عمل میکند. با این حال، ممکن است زمانهایی باشد که این مورد صادق نباشد. برای مثال، شما ممکن است به فایلی نگاه کنید که در چند زیرپوشه زیر دایرکتوری کاری فعلی شما قرار دارد و از یک مسیر نسبی استفاده کنید، سپس با استفاده از اصلاحکننده “h” به زیرپوشه بروید. در این صورت، دیگر نمیتوانید از نام مسیر نسبی برای رسیدن به فایل استفاده کنید.
یکی دیگر از اصلاحکنندههای بسیار مفید، اصلاحکننده r
است که پسوند انتهایی را حذف میکند. این میتواند مفید باشد اگر شما از دستور tar
برای استخراج یک فایل استفاده میکنید و میخواهید به دایرکتوری ایجاد شده پس از آن وارد شوید. فرض کنید دایرکتوری تولید شده همان نام فایل است، شما میتوانید کاری مشابه این انجام دهید.
tar xzvf long-project-name.tgz
cd !!:$:r
اگر فایل فشرده شما از پسوند tar.gz
به جای tgz
استفاده میکند، میتوانید اصلاح کننده را دوبار استفاده کنید.
tar xzvf long-project-name.tgz
cd !!:$:r:r
اصلاحکننده مشابهی به نام e
وجود دارد که همه چیز را به جز پسوند انتهایی حذف میکند.
اگر شما نمیخواهید دستوری که فراخوانی میکنید اجرا شود و تنها میخواهید آن را پیدا کنید، میتوانید از اصلاحکننده p
استفاده کنید تا دستور مورد نظر را به جای اجرا، فقط نمایش دهد.
این برای زمانی مفید است که مطمئن نیستید که قطعه صحیحی را انتخاب کردهاید یا خیر. این نه تنها دستور را چاپ میکند، بلکه آن را در تاریخچه شما قرار میدهد تا در صورت نیاز به ویرایش بیشتر، آن را تغییر دهید.
برای مثال، تصور کنید که شما یک دستور find
روی دایرکتوری خانگی خود اجرا کردهاید و سپس متوجه شدید که میخواهید آن را از دایرکتوری ریشه (/
) اجرا کنید. شما میتوانید برای اطمینان از اینکه جایگزینیها را به درستی انجام دادهاید، این کار را انجام دهید (با فرض اینکه دستور اصلی در تاریخچه با شماره 119 ذخیره شده باشد).
find ~ -name "file1"
!119:0:p / !119:2*:p
Output
find / -name "file1"
اگر دستور بازگشتی درست باشد، میتوانید آن را با ترکیب کلیدهای CTRL + P
اجرا کنید.
شما همچنین میتوانید در دستورات خود جایگزینیهایی انجام دهید با استفاده از سینتکس s/original/new/
.
برای مثال، شما میتوانید این کار را با تایپ کردن انجام دهید.
!119:s/~/\//
این دستور اولین نمونه از الگوی جستجو (~
) را جایگزین میکند.
شما میتوانید هر تطابق را با اضافه کردن پرچم g
به دستور s
جایگزین کنید. به عنوان مثال، اگر میخواهید فایلهایی با نامهای file1
، file2
و file3
بسازید و سپس میخواهید دایرکتوریهایی به نامهای dir1
، dir2
و dir3
بسازید، میتوانید این کار را انجام دهید.
touch file1 file2 file3
mkdir !!:*:gs/file/dir/
البته، ممکن است در اینجا منطقیتر باشد که دستور mkdir dir1 dir2 dir3
را به سادگی اجرا کنید. با این حال، با آشنایی با اصلاحکنندهها و ابزارهای گسترش تاریخچه در bash، میتوانید قابلیتها و بهرهوری خود را در خط فرمان به طور چشمگیری افزایش دهید.

جمع بندی
با خواندن این مقاله، حالا باید دید خوبی از نحوه استفاده از عملیات تاریخچه در دسترس خود داشته باشید. برخی از این عملیات ممکن است برای شما مفید تر از بقیه باشند، اما خوب است بدانید که bash این قابلیتها را در اختیار شما قرار میدهد، چرا که ممکن است در موقعیتی قرار بگیرید که نیاز به استفاده از آنها داشته باشید.
اگر هیچ چیز دیگری نباشد، تنها دستور تاریخچه، جستجوی معکوس و گسترشهای پایهای تاریخچه میتوانند کمک زیادی به شما در سرعت بخشیدن به روند کاریتان کنند.