Bash: تفاوت بین نسخهها
(تصحیح) |
جز (←میانبرهای صفحهکلید) |
||
(۱۵ نسخهٔ میانی ویرایش شده توسط ۴ کاربر نشان داده نشده) | |||
سطر ۱: | سطر ۱: | ||
− | [[پرونده:bash.png|200px|thumb|left| | + | [[پرونده:bash.png|200px|thumb|left|نمایی از پوستهٔ بش]] |
− | '''بَش''' (به انگلیسی Bash | + | '''گنو بَش''' (به انگلیسی GNU Bash) سرواژگان ''' GNU B'''ourne-'''A'''gain '''Sh'''ell یک [[Shell|پوسته]] برای [[OS|سیستمعاملهای]] [[شبه یونیکس]] است که به صورت [[Free Software|آزاد]] و تحت پروانهٔ GPLv3 توسّط [[Brian Fox|برایان فاکس]] در [[GNU Project|پروژهٔ گنو]] نوشته شدهاست. |
− | = ویژگیها = | + | == ویژگیها == |
− | بش یک پوستهٔ [[POSIX|پازیکس]] با تعداد قابل توجّهی افزونه است. در ابتدا این پوسته برای [[GNU OS|سیستمعامل گنو]] طرّاحی شدهبود، ولی امروزه در بیشتر سیستمعاملهای شبهیونیکس قابل اجرا و پوستهٔ پیشگزیدهٔ اغلب [[Distro|توزیعهای]] سیستمعامل [[GNU/Linux|گنو/لینوکس]] و همچنین | + | بش یک پوستهٔ [[POSIX|پازیکس]] با تعداد قابل توجّهی افزونه است. در ابتدا این پوسته برای [[GNU OS|سیستمعامل گنو]] طرّاحی شدهبود، ولی امروزه در بیشتر سیستمعاملهای شبهیونیکس قابل اجرا و پوستهٔ پیشگزیدهٔ اغلب [[Distro|توزیعهای]] سیستمعامل [[GNU/Linux|گنو/لینوکس]] و همچنین [[Mac OS|مک]] است. این پوسته به وسیلهٔ شبیهساز پوزیکس [[Cygwin|سیگوین]] برای سیستمعامل [[Windows|ویندوز]] نیز پورت شده است. همچنین ویندوز نیز از نگارش ده به بعد، امکان اجرای آن را توسّط مفسّر فراخوانهای سامانهای گنو/لینوکس فراهم کرده است. |
تقریباً تمامی [[Script|اسکریپتهای]] نوشته شده برای پوستهٔ [[Bourne|بورن]] بدون تغییر در بش نیز قابل اجرایند. همچنین در شکل، دستورهای بش از پوستهٔ [[Korn|کورن]] و پوستهٔ [[C|سی]] نیز الهام گرفتهاند، مانند ویرایش [[CLI|خط فرمان]]، تاریخچهٔ فرمان، متغیَرهای <code>RANDOM$</code> و <code>PPID$</code> و جایگزینی فرمان مطابق پازیکس <code>(…)$</code>. ویژگی [[Auto Complete|تکمیل خودکار]] نیز از ویژگیهای پرکاربرد بش است که میتوان با زدن [[Tab Key|کلید جهش]] نام ناکامل برنامهها، پروندهها و متغیرها را به صورت خودکار کامل کرد. | تقریباً تمامی [[Script|اسکریپتهای]] نوشته شده برای پوستهٔ [[Bourne|بورن]] بدون تغییر در بش نیز قابل اجرایند. همچنین در شکل، دستورهای بش از پوستهٔ [[Korn|کورن]] و پوستهٔ [[C|سی]] نیز الهام گرفتهاند، مانند ویرایش [[CLI|خط فرمان]]، تاریخچهٔ فرمان، متغیَرهای <code>RANDOM$</code> و <code>PPID$</code> و جایگزینی فرمان مطابق پازیکس <code>(…)$</code>. ویژگی [[Auto Complete|تکمیل خودکار]] نیز از ویژگیهای پرکاربرد بش است که میتوان با زدن [[Tab Key|کلید جهش]] نام ناکامل برنامهها، پروندهها و متغیرها را به صورت خودکار کامل کرد. | ||
− | بش دارای تعداد بسیاری افزونه است که پوستهٔ بورن فاقد آنهاست. بش بر خلاف بورن، میتواند بدون اجرا کردن [[Proccess|فرایندی]] بیرونی روی اعداد صحیح محاسبات انجام دهد. بش از شکل دستوری <code>((…))</code> و متغیرهایی به صورت <code>((…))$</code> برای این کار استفاده میکند. شکل دستورهای بش به گونهای است که امکان [[Redirection|تغییر مسیر]] ورودی/خروجی را به شکل سادهای به کاربر میدهد. به عنوان نمونه بش میتواند [[stdout|خروجی استاندارد]] و [[stderr|خطای استاندارد]] را توسّط اپراتور <& در یک زمان تغییر مسیر دهد. همین کار را در پوستهٔ بورن باید توسّط <code>'command> file 2>&1'</code> انجام داد که نسبت به بش سختتر است. به دلیل این تفاوتها اسکریپتهای نوشته شده برای بش، به ندرت در پوستههای بورن یا کورن قابل اجرا هستند، مگر این که در نوشتن آنها به سازگاری فرمانهای مورد استفاده توجّه شود. البته در حالت Posix | + | بش دارای تعداد بسیاری افزونه است که پوستهٔ بورن فاقد آنهاست. بش بر خلاف بورن، میتواند بدون اجرا کردن [[Proccess|فرایندی]] بیرونی روی اعداد صحیح محاسبات انجام دهد. بش از شکل دستوری <code>((…))</code> و متغیرهایی به صورت <code>((…))$</code> برای این کار استفاده میکند. شکل دستورهای بش به گونهای است که امکان [[Redirection|تغییر مسیر]] ورودی/خروجی را به شکل سادهای به کاربر میدهد. به عنوان نمونه بش میتواند [[stdout|خروجی استاندارد]] و [[stderr|خطای استاندارد]] را توسّط اپراتور <& در یک زمان تغییر مسیر دهد. همین کار را در پوستهٔ بورن باید توسّط <code>'command> file 2>&1'</code> انجام داد که نسبت به بش سختتر است. به دلیل این تفاوتها اسکریپتهای نوشته شده برای بش، به ندرت در پوستههای بورن یا کورن قابل اجرا هستند، مگر این که در نوشتن آنها به سازگاری فرمانهای مورد استفاده توجّه شود. البته در حالت Posix Mode خیلی بیشتر از پازیکس تبعیت میکند. |
− | = افزونههای براکت = | + | == افزونههای براکت == |
− | یکی از ویژگیهایی که از پوستهٔ سی به درون بش راه یافته، افزونههای براکت است که میتوان توسّط این امکان ترکیبهایی تکرار شونده به وجود آورد. ترتیب اجرای این دستورهای گسترشیافته از چپ به راست است. به نمونههای زیر توجه کنید : | + | یکی از ویژگیهایی که از پوستهٔ سی به درون بش راه یافته، افزونههای براکت است که میتوان توسّط این امکان ترکیبهایی تکرار شونده به وجود آورد. ترتیب اجرای این دستورهای گسترشیافته از چپ به راست است. به نمونههای زیر توجه کنید: |
− | + | ||
+ | {{bc| | ||
$ echo a{p,c,d,b}e | $ echo a{p,c,d,b}e | ||
ape ace ade abe | ape ace ade abe | ||
سطر ۱۷: | سطر ۱۸: | ||
$ echo {a,b,c}{d,e,f} | $ echo {a,b,c}{d,e,f} | ||
ad ae af bd be bf cd ce cf | ad ae af bd be bf cd ce cf | ||
− | + | }} | |
+ | |||
+ | از این ویژگی نمیتوان در اسکریپتهایی که قصد داریم قابل حمل باشند استفاده کرد، به دلیل این که بورن خروجی دیگری برای آن تولید میکند: | ||
− | + | {{bc| | |
− | |||
# A traditional shell does not produce the same output | # A traditional shell does not produce the same output | ||
$ echo a{p,c,d,b}e | $ echo a{p,c,d,b}e | ||
a{p,c,d,b}e | a{p,c,d,b}e | ||
− | + | }} | |
وقتی براکتها توسّط [[wildcars|نویسههای جایگزین]] استفاده شوند، ابتدا براکتها و سپس نویسههای جایگزین اعمال میشوند. به عنوان نمونه برای نمایش فهرستی از تصاویر JPEG و PNG موجود در [[Directory|شاخهٔ]] فعلی، میتوان از دستور زیر استفاده کرد: | وقتی براکتها توسّط [[wildcars|نویسههای جایگزین]] استفاده شوند، ابتدا براکتها و سپس نویسههای جایگزین اعمال میشوند. به عنوان نمونه برای نمایش فهرستی از تصاویر JPEG و PNG موجود در [[Directory|شاخهٔ]] فعلی، میتوان از دستور زیر استفاده کرد: | ||
− | + | ||
+ | {{bc| | ||
$ ls *.{jpg,jpeg,png} | $ ls *.{jpg,jpeg,png} | ||
# expands to *.jpg *.jpeg *.png - after which, | # expands to *.jpg *.jpeg *.png - after which, | ||
# the wildcards are processed | # the wildcards are processed | ||
− | + | }} | |
− | = اسکریپتهای راهاندازی = | + | == اسکریپتهای راهاندازی == |
وقتی بش اجرا میشود، دستورهای موجود در اسکریپتهای مختلفی را اجرا می کند. | وقتی بش اجرا میشود، دستورهای موجود در اسکریپتهای مختلفی را اجرا می کند. | ||
وقتی بش به عنوان یک پوستهٔ تعاملی اجرا میشود، ابتدا اگر پروندهٔ <code>etc/profile</code> موجود باشد دستورهای درون آن را میخواند و اجرا میکند. سپس به ترتیب به دنبال یکی از پروندههای <code>bash_profile.</code> یا <code>bash_login.</code> یا <code>profile.</code> در شاخهٔ خانگی کاربر میگردد (<code>/~</code>). هر کدام را که پیدا کرد، دستورهای درون آن را میخواند و اجرا میکند. | وقتی بش به عنوان یک پوستهٔ تعاملی اجرا میشود، ابتدا اگر پروندهٔ <code>etc/profile</code> موجود باشد دستورهای درون آن را میخواند و اجرا میکند. سپس به ترتیب به دنبال یکی از پروندههای <code>bash_profile.</code> یا <code>bash_login.</code> یا <code>profile.</code> در شاخهٔ خانگی کاربر میگردد (<code>/~</code>). هر کدام را که پیدا کرد، دستورهای درون آن را میخواند و اجرا میکند. | ||
− | = میانبرهای صفحهکلید = | + | == میانبرهای صفحهکلید == |
− | میانبرهای گفته شده در زیر برای حالت پیشفرض ([[Emacs|ایمکس]]) است، میانبرهای [[Vim|ویم]] را میتوان | + | میانبرهای گفته شده در زیر برای حالت پیشفرض ([[Emacs|ایمکس]]) است، میانبرهای [[Vim|ویم]] را میتوان با دستور <code>set -o vi</code> فعّال کرد. |
− | + | ||
− | + | {| class="wikitable sortable" | |
− | + | ! class="unsortable"| میانبر | |
− | + | ! class="unsortable"| کاربرد | |
− | + | |- | |
− | + | | [[Tab Key|جهش]] || [[Auto Complete|تکمیل خودکار]] از جایی که مکاننما وجود دارد | |
− | + | |- | |
− | + | | <code>Ctrl+a</code> || انتقال مکاننما به ابتدای خط (معادل کلید Home) | |
− | + | |- | |
− | + | | <code>Ctrl+e</code> || انتقال مکاننما به انتهای خط (معادل کلید End) | |
− | + | |- | |
− | + | | <code>Ctrl+p</code> || فراخوانی فرمان قبلی (معادل کلید Up) | |
− | + | |- | |
− | + | | <code>Ctrl+n</code> || فراخوانی فرمان بعدی (معادل کلید Down) | |
− | + | |- | |
− | + | | <code>Ctrl+r</code> || جستوجوی آخرین فرمانی که دارای نویسه(های) مشخّصی باشد. زدن دوبارهٔ این کلید در هنگام جستوجو، به فرمان قبلیتر رجوع میکند. | |
− | + | |- | |
− | + | | <code>Ctrl+o</code> || اجرای فرمانی که در جستوجو یافته شد. | |
− | + | |- | |
− | + | | <code>Ctrl+l</code> || پاک کردن محتویات صفحهنمایش (معادل فرمان clear). | |
− | + | |- | |
− | + | | <code>Ctrl+u</code> || پاک کردن محتویاتی از خط که قبل از مکاننما وجود دارند و رونوشت آنها درون بریدهدان. | |
− | + | |- | |
− | + | | <code>Ctrl+k</code> || پاک کردن محتویاتی از خط که بعد از مکاننما وجود دارند و رونوشت آنها درون بریدهدان. | |
+ | |- | ||
+ | | <code>Ctrl+w</code> || پاک کردن واژهٔ پیش از مکاننما و رونوشت آن درون بریدهدان. | ||
+ | |- | ||
+ | | <code>Ctrl+y</code> || چسباندن محتویات بریدهدان از جایی که مکاننما وجود دارد. | ||
+ | |- | ||
+ | | <code>Ctrl+d</code> || ارسال یک نشانگر EOF که باعث بسته شدن خط فرمان فعلی میشود (معادل دستور exit). (تنها در زمانی این اتّفاق میافتد که متنی در خطّ فعلی موجود نباشد) | ||
+ | |- | ||
+ | | <code>Ctrl+c</code> || ارسال یک سیگنال از نوع SIGINT به فرایند فعلی، که باعث پایان اجرا و بسته شدن آن میشود. | ||
+ | |- | ||
+ | | <code>Ctrl+z</code> || ارسال یک سیگنال از نوع SIGTSTP به فرایند فعلی، که باعث به تعلیق در آمدن آن میشود. که برای برگشت دادن آن میتوان از دستور fg process-name-or-job-id استفاده کرد. | ||
+ | |- | ||
+ | | <code>Ctrl+x Ctrl+e</code> || ویرایش خط فعلی در ادیتوری که توسط متغیّر محیطی EDITOR$ تعریف شده است. | ||
+ | |- | ||
+ | | <code>Alt+f</code> || حرکت به جلو به اندازهٔ یک واژه. | ||
+ | |- | ||
+ | | <code>Alt+b</code> || حرکت به عقب به اندازهٔ یک واژه. | ||
+ | |- | ||
+ | | <code>Alt+Del</code> || برش واژهٔ واقع در پیش از مکاننما | ||
+ | |- | ||
+ | | <code>Alt+d</code> || برش واژهٔ واقع در پس از مکاننما | ||
+ | |- | ||
+ | | <code>Alt+u</code> || تبدیل تمام حروف کوچک به بزرگ، واقع در پس از مکاننما تا انتهای واژهٔ فعلی | ||
+ | |- | ||
+ | | <code>Alt+l</code> || تبدیل تمام حروف بزرگ به کوچک، واقع در پس از مکاننما تا انتهای واژهٔ فعلی | ||
+ | |- | ||
+ | | <code>Alt+c</code> || تبدیل حرف واقع در زیر مکاننما از کوچک به بزرگ و رفتن به انتهای واژهٔ فعلی | ||
+ | |- | ||
+ | | <code>Alt+r</code> || انصراف تغییرات و برگرداندن محتویات خط فعلی به همان شکلی که در تاریخچهٔ خط فرمان موجود بود. | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | == بستههای مکمّل == | ||
+ | |||
+ | === bash-completion === | ||
+ | این بسته، مکمّلی برای بَش است که با تشخیص برنامههای موجود و به کار رفته در پوسته و یا سیستمعامل، ادامهٔ فرمانها را پیشنهاد میدهد. | ||
+ | این قابلیت با فشردن کلید [[Tab Key|جهش]] بر روی [[Keyboard|صفحهکلید]] قابل اجرا است. همچنین با دوبار فشردن این کلید، فرمانهای پیشنهادی به صورت کامل ظاهر خواهند شد. | ||
+ | |||
+ | برای نصب، از فرمان زیر استفاده میشود: | ||
+ | {{bc|$ sudo apt install bash-completion}} | ||
[[رده:پوستهها]] | [[رده:پوستهها]] | ||
[[رده:گنو]] | [[رده:گنو]] |
نسخهٔ کنونی تا ۱۳ تیر ۱۴۰۳، ساعت ۰۹:۲۳
گنو بَش (به انگلیسی GNU Bash) سرواژگان GNU Bourne-Again Shell یک پوسته برای سیستمعاملهای شبه یونیکس است که به صورت آزاد و تحت پروانهٔ GPLv3 توسّط برایان فاکس در پروژهٔ گنو نوشته شدهاست.
محتویات
ویژگیها
بش یک پوستهٔ پازیکس با تعداد قابل توجّهی افزونه است. در ابتدا این پوسته برای سیستمعامل گنو طرّاحی شدهبود، ولی امروزه در بیشتر سیستمعاملهای شبهیونیکس قابل اجرا و پوستهٔ پیشگزیدهٔ اغلب توزیعهای سیستمعامل گنو/لینوکس و همچنین مک است. این پوسته به وسیلهٔ شبیهساز پوزیکس سیگوین برای سیستمعامل ویندوز نیز پورت شده است. همچنین ویندوز نیز از نگارش ده به بعد، امکان اجرای آن را توسّط مفسّر فراخوانهای سامانهای گنو/لینوکس فراهم کرده است.
تقریباً تمامی اسکریپتهای نوشته شده برای پوستهٔ بورن بدون تغییر در بش نیز قابل اجرایند. همچنین در شکل، دستورهای بش از پوستهٔ کورن و پوستهٔ سی نیز الهام گرفتهاند، مانند ویرایش خط فرمان، تاریخچهٔ فرمان، متغیَرهای RANDOM$
و PPID$
و جایگزینی فرمان مطابق پازیکس (…)$
. ویژگی تکمیل خودکار نیز از ویژگیهای پرکاربرد بش است که میتوان با زدن کلید جهش نام ناکامل برنامهها، پروندهها و متغیرها را به صورت خودکار کامل کرد.
بش دارای تعداد بسیاری افزونه است که پوستهٔ بورن فاقد آنهاست. بش بر خلاف بورن، میتواند بدون اجرا کردن فرایندی بیرونی روی اعداد صحیح محاسبات انجام دهد. بش از شکل دستوری ((…))
و متغیرهایی به صورت ((…))$
برای این کار استفاده میکند. شکل دستورهای بش به گونهای است که امکان تغییر مسیر ورودی/خروجی را به شکل سادهای به کاربر میدهد. به عنوان نمونه بش میتواند خروجی استاندارد و خطای استاندارد را توسّط اپراتور <& در یک زمان تغییر مسیر دهد. همین کار را در پوستهٔ بورن باید توسّط 'command> file 2>&1'
انجام داد که نسبت به بش سختتر است. به دلیل این تفاوتها اسکریپتهای نوشته شده برای بش، به ندرت در پوستههای بورن یا کورن قابل اجرا هستند، مگر این که در نوشتن آنها به سازگاری فرمانهای مورد استفاده توجّه شود. البته در حالت Posix Mode خیلی بیشتر از پازیکس تبعیت میکند.
افزونههای براکت
یکی از ویژگیهایی که از پوستهٔ سی به درون بش راه یافته، افزونههای براکت است که میتوان توسّط این امکان ترکیبهایی تکرار شونده به وجود آورد. ترتیب اجرای این دستورهای گسترشیافته از چپ به راست است. به نمونههای زیر توجه کنید:
$ echo a{p,c,d,b}e ape ace ade abe $ echo {a,b,c}{d,e,f} ad ae af bd be bf cd ce cf
از این ویژگی نمیتوان در اسکریپتهایی که قصد داریم قابل حمل باشند استفاده کرد، به دلیل این که بورن خروجی دیگری برای آن تولید میکند:
# A traditional shell does not produce the same output $ echo a{p,c,d,b}e a{p,c,d,b}e
وقتی براکتها توسّط نویسههای جایگزین استفاده شوند، ابتدا براکتها و سپس نویسههای جایگزین اعمال میشوند. به عنوان نمونه برای نمایش فهرستی از تصاویر JPEG و PNG موجود در شاخهٔ فعلی، میتوان از دستور زیر استفاده کرد:
$ ls *.{jpg,jpeg,png} # expands to *.jpg *.jpeg *.png - after which, # the wildcards are processed
اسکریپتهای راهاندازی
وقتی بش اجرا میشود، دستورهای موجود در اسکریپتهای مختلفی را اجرا می کند.
وقتی بش به عنوان یک پوستهٔ تعاملی اجرا میشود، ابتدا اگر پروندهٔ etc/profile
موجود باشد دستورهای درون آن را میخواند و اجرا میکند. سپس به ترتیب به دنبال یکی از پروندههای bash_profile.
یا bash_login.
یا profile.
در شاخهٔ خانگی کاربر میگردد (/~
). هر کدام را که پیدا کرد، دستورهای درون آن را میخواند و اجرا میکند.
میانبرهای صفحهکلید
میانبرهای گفته شده در زیر برای حالت پیشفرض (ایمکس) است، میانبرهای ویم را میتوان با دستور set -o vi
فعّال کرد.
میانبر | کاربرد |
---|---|
جهش | تکمیل خودکار از جایی که مکاننما وجود دارد |
Ctrl+a |
انتقال مکاننما به ابتدای خط (معادل کلید Home) |
Ctrl+e |
انتقال مکاننما به انتهای خط (معادل کلید End) |
Ctrl+p |
فراخوانی فرمان قبلی (معادل کلید Up) |
Ctrl+n |
فراخوانی فرمان بعدی (معادل کلید Down) |
Ctrl+r |
جستوجوی آخرین فرمانی که دارای نویسه(های) مشخّصی باشد. زدن دوبارهٔ این کلید در هنگام جستوجو، به فرمان قبلیتر رجوع میکند. |
Ctrl+o |
اجرای فرمانی که در جستوجو یافته شد. |
Ctrl+l |
پاک کردن محتویات صفحهنمایش (معادل فرمان clear). |
Ctrl+u |
پاک کردن محتویاتی از خط که قبل از مکاننما وجود دارند و رونوشت آنها درون بریدهدان. |
Ctrl+k |
پاک کردن محتویاتی از خط که بعد از مکاننما وجود دارند و رونوشت آنها درون بریدهدان. |
Ctrl+w |
پاک کردن واژهٔ پیش از مکاننما و رونوشت آن درون بریدهدان. |
Ctrl+y |
چسباندن محتویات بریدهدان از جایی که مکاننما وجود دارد. |
Ctrl+d |
ارسال یک نشانگر EOF که باعث بسته شدن خط فرمان فعلی میشود (معادل دستور exit). (تنها در زمانی این اتّفاق میافتد که متنی در خطّ فعلی موجود نباشد) |
Ctrl+c |
ارسال یک سیگنال از نوع SIGINT به فرایند فعلی، که باعث پایان اجرا و بسته شدن آن میشود. |
Ctrl+z |
ارسال یک سیگنال از نوع SIGTSTP به فرایند فعلی، که باعث به تعلیق در آمدن آن میشود. که برای برگشت دادن آن میتوان از دستور fg process-name-or-job-id استفاده کرد. |
Ctrl+x Ctrl+e |
ویرایش خط فعلی در ادیتوری که توسط متغیّر محیطی EDITOR$ تعریف شده است. |
Alt+f |
حرکت به جلو به اندازهٔ یک واژه. |
Alt+b |
حرکت به عقب به اندازهٔ یک واژه. |
Alt+Del |
برش واژهٔ واقع در پیش از مکاننما |
Alt+d |
برش واژهٔ واقع در پس از مکاننما |
Alt+u |
تبدیل تمام حروف کوچک به بزرگ، واقع در پس از مکاننما تا انتهای واژهٔ فعلی |
Alt+l |
تبدیل تمام حروف بزرگ به کوچک، واقع در پس از مکاننما تا انتهای واژهٔ فعلی |
Alt+c |
تبدیل حرف واقع در زیر مکاننما از کوچک به بزرگ و رفتن به انتهای واژهٔ فعلی |
Alt+r |
انصراف تغییرات و برگرداندن محتویات خط فعلی به همان شکلی که در تاریخچهٔ خط فرمان موجود بود. |
بستههای مکمّل
bash-completion
این بسته، مکمّلی برای بَش است که با تشخیص برنامههای موجود و به کار رفته در پوسته و یا سیستمعامل، ادامهٔ فرمانها را پیشنهاد میدهد. این قابلیت با فشردن کلید جهش بر روی صفحهکلید قابل اجرا است. همچنین با دوبار فشردن این کلید، فرمانهای پیشنهادی به صورت کامل ظاهر خواهند شد.
برای نصب، از فرمان زیر استفاده میشود:
$ sudo apt install bash-completion