در این مقاله، نگاهی دقیقتر به تاریخچه bash، نحوه عملکرد آن و نحوه استفاده از آن برای افزایش کارایی در هنگام کار با خط فرمان لینوکس خواهیم داشت. میتوانید دستورات این مقاله را تقریباً با استفاده از هر سیستم عامل مدرن *nix با bash دنبال کنید.
تاریخچه بش چیست؟ #
اصطلاح تاریخچه bash به دستورات، فایلها و میانبرهایی اشاره دارد که به شما امکان مشاهده، تغییر و حذف دستورات bash اجرا شده روی یک سیستم را میدهند.
Bash دو دستور برای کار با تاریخچه bash دارد:
history– به شما امکان میدهد دستورات را فهرست کرده و تاریخچه bash خود را تغییر دهید.fc– به شما امکان میدهد دستورات موجود در تاریخچه bash خود را فهرست، ویرایش و اجرا کنید.
از آنجا که اصطلاح «تاریخچه bash» اغلب به معنای خود دستور است، ما در بیشتر این مقاله به جای آن، historyبر سازوکار دستور تمرکز خواهیم کرد .historyfc
علاوه بر این دو دستور bulitin، انواع فایلها (مانند ~/.bash_history)، بسطها (مانند !!) و میانبرهای صفحه کلید (مانند کلیدهای ↑ و ↓) وجود دارند که به شما در کار با تاریخچه bash کمک میکنند.
در بخشهای زیر، نحوه عملکرد این جنبههای تاریخچه bash را بررسی خواهیم کرد.
تاریخچه Bash کجا ذخیره میشود؟ #
به طور پیشفرض، historyدستورات را تا زمانی که از ترمینال خارج شوید در RAM ذخیره میکند. پس از خروج، دستورات در ~/.bash_historyفایل روی دیسک نوشته میشوند. بافر تاریخچه به ۱۰۰۰ ورودی دستور و فایل تاریخچه به ۲۰۰۰ ورودی محدود است.
شما میتوانید رفتار پیشفرض historyدستور را با تنظیم متغیرهای محیطی تغییر دهید، که به زودی جزئیات بیشتری در مورد آنها بررسی خواهیم کرد.
کار با تاریخچه Bash: اصول اولیه #
تاریخچهی Bash قابلیتی است که به شما امکان مشاهده و پاک کردن دستورات اجرا شدهی قبلی را میدهد. در ادامه، نحوهی مشاهدهی تاریخچهی bash، نحوهی پاک کردن تاریخچهی bash و همچنین نحوهی جستجو در تاریخچهی bash را بررسی خواهیم کرد.
چگونه تاریخچه Bash را ببینیم؟ #
سادهترین راه برای شروع کار با bash، اجرای historyدستور بدون هیچ گزینهای است. خروجی مشابه زیر را خواهید دید:
history
۱ echo "one"
۲ echo "two"
۳ echo "three"
۴ echo "four"
۵ echo "five"
۶ echo "six"
اعداد کنار دستورات، ترتیب وارد شدن آنها در تاریخچه را نشان میدهند (قدیمیترین دستور ۱ است). همچنین میتوانید از کلیدهای ↑ و ↓ روی صفحه کلید خود برای پیمایش در تاریخچه bash خود استفاده کنید.
میتوانیم با دستور زیر خروجی را به N دستور آخر محدود کنیم history N. برای مثال، history 2دو دستور اخیر را برمیگرداند.
history 2
۶ echo "six"
۷ history 2
میتوانید تاریخچه را به داخل grepیا lessبرای فیلتر کردن آسانتر خروجی، لولهکشی کنید.
history | grep ping
۶ ping cherryservers.com
۲۷ history | grep ping
چگونه تاریخچه Bash را پاک کنیم؟ #
برای پاک کردن تاریخچه Bash، میتوانید یک ورودی خاص را با حذف کنید که history -d Nدر آن N شماره دستور یا محدودهای از اعداد است. به عنوان مثال، history -d 2-4دستورات ۲، ۳ و ۴ را از تاریخچه ما حذف میکند.
برای پاک کردن بافر تاریخچه (یعنی دستورات ذخیره شده در RAM برای جلسه ترمینال فعلی) از دستور استفاده کنید history -c.
تاریخچه bash که به طور پیش فرض روی دیسک ذخیره میشود، در مسیر زیر قرار دارد $HISTFILE. ~/.bash_historyمیتوانید آن فایل را با دستوری مانند زیر پاک کنید:
cat /dev/null > ~/.bash_history
پیکربندی تنظیمات تاریخچه Bash با .bashrc #
در برخی موارد، ممکن است بخواهید نحوه عملکرد تاریخچه bash را در سیستم لینوکس خود تغییر دهید. افزودن متغیرهای محیطی لینوکس به فایل شما میتواند به شما در انجام این کار کمک کند. در اینجا چند مورد استفاده رایج برای سفارشیسازی تاریخچه bash با استفاده از . ~/.bashrcآمده است .~/.bashrc
در ادامه، به یاد داشته باشید که تغییرات در فایل کاربر ~/.bashrcپس از خروج و ورود مجدد به پوسته شما اعمال میشوند. به عنوان یک روش جایگزین، میتوانید تنظیمات bash را اجرا کنید . ~/.bashrcیا دوباره بارگذاری کنید.source ~/.bashrc
حذف دستورات از تاریخچه Bash #
ممکن است بخواهید دستورات را از تاریخچه bash حذف کنید تا از نویز در خروجی جلوگیری شود یا به دلایل امنیتی. در بسیاری از توزیعهای لینوکس، میتوانید با اضافه کردن یک فاصله قبل از اجرای دستور، از ورود آن به تاریخچه bash جلوگیری کنید.

با این حال، این ممکن است در مورد همه توزیعها صادق نباشد. اینکه آیا فاصلههای ابتدایی نادیده گرفته میشوند یا خیر، به $HISTCONTROLمتغیر محیطی بستگی دارد. اگر $HISTCONTROLروی ignorebothیا تنظیم شده باشد ignorespace، دستوراتی که دارای فاصله ابتدایی هستند در تاریخ ذخیره نمیشوند.
برای حذف دستورات از تاریخچه bash خود با استفاده از ~/.bashrc، میتوانید از $HISTIGNOREمتغیر محیطی استفاده کنید. $HISTIGNOREبه شما امکان میدهد لیستی از الگوهای دستوری را که با دونقطه از هم جدا شدهاند و در تاریخچه bash شما ذخیره نمیشوند، تعریف کنید. به عنوان مثال، برای نادیده گرفتن هر sudoدستور یا هر دستوری که در آن echoبا یک w، دنبال میشود، این را به لیست خود اضافه کنید.~/.bashrc
HISTIGNORE='sudo *':'echo w*'
دستورات را فوراً در .bash_history ذخیره کنید #
معمولاً کاربران چندین ترمینال را برای یک حساب کاربری باز دارند و اینجاست که اوضاع میتواند پیچیده شود. به طور پیشفرض، این historyدستور فقط دستورات مربوط به جلسه ترمینال فعلی را نشان میدهد و دستوراتی که در ~/.bash_historyفایل ذخیره میشوند، دستورات مربوط به آخرین جلسه برای خروج هستند.

برای اینکه دستورات بلافاصله در ~/.bash_historyفایل شما باقی بمانند، میتوانید این کد را به فایل اضافه کنید ~/.bashrc:
PROMPT_COMMAND='history -a'
تاریخچه Bash به همراه مهر زمانی: تاریخ و مهرهای زمانی را به خروجی تاریخچه Bash اضافه کنید #
اغلب، دانستن اینکه چه زمانی یک دستور را اجرا کردهاید، بخش مهمی از دانستن اینکه اکنون به کدام دستور نیاز دارید، است. اضافه کردن مهرهای زمانی به خروجی تاریخچه bash شما میتواند این کار را آسانتر کند.
برای اضافه کردن مهرهای زمانی به تاریخچه bash خود، این را به فایل زیر اضافه کنید ~/.bashrc:
HISTTIMEFORMAT="%F %T "
%F تاریخ را با فرمت YYYY-MM-DD اضافه میکند و %T یک مهر زمانی HH:MM:SS نیز به آن اضافه میکند. در اینجا مثالی از historyخروجی دستور با این مجموعه متغیر محیطی bash آورده شده است.

توجه داشته باشید که فاصله بعد از %Fand %Tبرای قالببندی خروجی مفید است. بدون فاصله، تاریخ، مهر زمان و دستور همگی با هم اجرا میشوند.
تغییر بافر تاریخچه Bash و اندازه فایل #
اگر مقادیر پیشفرض ۱۰۰۰ ورودی دستور در بافر تاریخچه و ۲۰۰۰ ورودی در فایل تاریخچه، آن چیزی نیست که شما میخواهید، میتوانید متغیرهای محیطی $HISTSIZE(buffer) و $HISTFILESIZE(file) را تغییر دهید.
برای مثال، برای تنظیم هر دو روی ۱۱۰۰۰ ورودی، مقادیر پیشفرض را به صورت زیر تغییر دهید:
HISTSIZE=11000
HISTFILESIZE=11000
جستجوی تاریخچه Bash: میانبرهای صفحه کلید #
علاوه بر این historyدستور، چندین میانبر صفحه کلید وجود دارد که کار با history در bash را آسان میکند. در اینجا به برخی از مفیدترین آنها اشاره میکنیم:
| میانبر صفحه کلید تاریخچه Bash | توضیحات |
|---|---|
| کلید ↑ | پیمایش به عقب در تاریخچه bash |
| کلید ↓ | حرکت به جلو در تاریخچه bash |
| ctrl+R | جستجوی دستورات در تاریخچه bash شما |
| ctrl+O | اجرای دستوری که با استفاده از جستجوی ctrl+R پیدا کردهاید |
| کنترل+جی | خروج از جستجو با crtl+R |
گسترش تاریخچه Bash #
اگر تا به حال دستور را اجرا کرده باشید sudo !!، از دستور بسط تاریخچه bash استفاده کردهاید. با این حال، روشهای بسیار دیگری برای استفاده از دستورات بسط برای کار با تاریخچه bash شما وجود دارد. در اینجا لیستی از برخی از مفیدترین بسطهای تاریخچه bash آورده شده است:
| دستور بسط تاریخچه Bash | توضیحات |
|---|---|
!! |
آخرین دستور اجرا شده در ترمینال. این معادل است با !-۱. |
!N |
دستور Nام در تاریخچه دستورات bash شما. |
!-N |
دستور N قبل از آخرین دستور در تاریخچه bash شما. |
برای نشان دادن منطق، یک مثال ساده ارائه میدهیم:

توجه داشته باشید که در مثال، ما قبل از دستورات بسط خود یک فاصله اضافه کردیم تا آنها در تاریخچه bash ما گنجانده نشوند.
تعیین کننده های تاریخچه ی Bash #
هر سه دستور بسط قبلی نمونههایی از نشانگرهای طراحی هستند. و چندین نشانگر قدرتمندتر وجود دارد که میتوانید برای کار با تاریخچه bash خود از آنها استفاده کنید.
!<command>جدیدترین دستورات <command>در تاریخچه bash شما را اجرا خواهد کرد. برای مثال، فرض کنید این دستورات را در خروجی خود داریم history:
۱ ping 1.1.2.2
۲ touch pepperandegg.txt
۳ curl -Lo cherry.html cherryservers.com
۴ rm somefile.log
۵ ls -la
!curlاجرا خواهد شد curl -Lo cherry.html cherryservers.com، !lsاجرا خواهد شد ls -la، و غیره.
همچنین میتوانید از ^designatorها برای جایگزینی بخشهایی از جدیدترین دستور در تاریخچه bash خود با محتوای متفاوت استفاده کنید. قالب کلی به این صورت است:
^<original content>^<new content>^
برای مثال، اگر دستور قبلی در تاریخچه شما این بوده باشد:
scp this.file root@host:/path/wrongplace
و اگر میخواستید به جای تایپ مجدد کل دستور، /path/wrongplaceبه این تغییر دهید، میتوانستید دستور زیر را اجرا کنید:/path/rightplace
^wrongplace^rightplace^
و خروجی مشابه زیر خواهد بود:
scp this.file root@localhost:/tmp/rightplace
root@host's password:
this.file 100% 10 0.0KB/s 00:01
استفاده از نشانگرها برای دریافت آرگومانها از یک دستور #
شما میتوانید از یک دونقطه :و به دنبال آن یک نشانگر خاص برای اضافه کردن آرگومانهایی از جدیدترین دستور در تاریخچه خود به دستور بعدی استفاده کنید. جدول زیر جزئیات برخی از نشانگرهای رایج را نشان میدهد:
| طراح | توضیحات |
|---|---|
!:^ |
از اولین آرگومان آخرین دستور در تاریخچه bash خود استفاده کنید. |
!:N |
از آرگومان Nام آخرین دستور در تاریخچه bash خود استفاده کنید |
!:$ |
از آخرین آرگومان آخرین دستور در تاریخچه bash خود استفاده کنید. |
!:* |
از تمام آرگومانهای آخرین دستور در تاریخچه bash خود استفاده کنید. |
در زیر مثالی برای تجسم مفهوم آورده شده است:

اصلاحکنندههای تاریخچه Bash #
اصلاحکنندههای تاریخچه Bash با تغییر محتوا یا اجرای دستور، معرفها را تکمیل میکنند. شما اصلاحکنندهها را بعد از یک دستور با یک دونقطه و یک حرف (مثلاً :h) مشخص میکنید.
در اینجا برخی از اصلاحکنندههای تاریخچه رایج bash و نحوه عملکرد آنها آورده شده است.
| اصلاحکننده | توضیحات |
|---|---|
:h |
مسیر انتهایی را از یک دستور حذف میکند. برای دریافت مسیر بدون نام فایل مفید است. |
:t |
مسیر ابتدایی یک دستور را حذف میکند. برای دریافت نام فایل بدون مسیر مفید است. |
:r |
پسوند را از نام فایل حذف میکند. |
:p |
یک دستور را بدون اجرای آن چاپ میکند. |
:s |
جایگزینی رشتهای مشابه با sedدستور را فعال میکند . |
برای مثال، فرض کنید میخواستیم تمام .logفایلهای یک دایرکتوری را با فهرست کنیم، ls /directory/*.logاما به جای آن دستور را اجرا کردیم ls /directory/*.txt. میتوانیم از این دستور !:s/txt/logبرای اصلاح اشتباه استفاده کنیم. از ابتدا تا انتها، چیزی شبیه به این خواهد بود:
ls /directory/*.txt
pepperAndEgg.txt
!:s/txt/log
ls /directory/*.log
log1.log log2.log log3.log
نتیجه گیری #
با آگاهی از دستورات history در bash، میتوانید در ترمینال لینوکس کارآمدتر عمل کنید. اطلاعاتی که در اینجا پوشش دادیم، به شما کمک میکند تا بیشتر موارد استفاده رایج از history در bash را که با آنها مواجه میشوید، مدیریت کنید. برای آشنایی عمیقتر با history در bash، توصیه میکنیم صفحه راهنمای GNU را برای دستورات bulin bash history مطالعه کنید و designatorها و سفارشیسازیهای مختلف را در محیط آزمایشی خود آزمایش کنید.
