> For the complete documentation index, see [llms.txt](https://sh.howtocode.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sh.howtocode.dev/2.0.0.part2intro/2.2.0.customprompt/2.2.1.customize.md).

# প্রম্পট কাস্টমাইজেশন

এখন আমরা দেখবো কীভাবে প্রম্পটকে আরো ব্যবহারযোগ্য করা যায়।

## প্রম্পটের ব্যবচ্ছেদ

একটি সাধারন প্রম্পট(উবুন্টুতে) দেখতে এমন হয়:

```
me@howtocode-pc:~$
```

আপনার ডিস্ট্রিবিউশনে তা অন্যরকম হতেই পারে। এর বিভিন্ন অংশ কেমন হবে তা প্রথম অধ্যায়ের প্রথম [লেসনে](/1.0.0.part1intro/1.1.0.basic/1.1.1.shell.md) আমরা দেখেছি। এখানে আপনার ইউজার নেম, হোস্টনেম ও ওয়ার্কিং ডিরেক্টরি থাকে। এবং সব শেষে থাকে শেলের ধরন(সুপার ইউজার না নরমাল ইউজারের শেল)।

এখন ব্যাপার হচ্ছে প্রম্পট কেমন হবে তা কীভাবে ঠিক করে কম্পিউটার? আপনার ব্যক্তিগত স্টার্টআপ ফাইল .bashrcতে একটা ভেরিয়েবল থাকে **PS1**(Prompt string one) নামে। এটিই নির্ধারন করে প্রম্পটটি কেমন হবে। আপনি PS1 এর মান অবশ্যই .bashrc ফাইলে গিয়ে দেখতে পারেন। তাছাড়াও echo কমান্ড দিয়ে দেখতে পারেন এভাবে:

```
me@howtocode-pc:~$ echo $PS1
\u@\h:\W\$
```

এরমধ্যে @, :, $ চিহ্নগুলো তো আমরা প্রম্পটে দেখতেই পাচ্ছি বাকিগুলো পাচ্ছি না। এবং অধিকাংশের সামনেই '\\'(ব্যাকস্ল্যাশ) আছে। সামনে ব্যাকস্ল্যাশ থাকলে তাদের বলে এস্কেপ ক্যারেক্টার। প্রম্পটের কাছে এরকম বিভিন্ন এস্কেপ ক্যারেক্টারের ভিন্ন মানে আছে। আসুন প্রম্পটে ব্যবহৃত এস্কেপ ক্যারেক্টারের মানে জেনে নিই:

| এস্কেপ ক্যারেক্টার | অর্থ                                                              |
| ------------------ | ----------------------------------------------------------------- |
| \a                 | অ্যাসকি বেল(ASCII bell)। এটা দিলে বীপ করে শব্দ হয়।                |
| \d                 | বর্তমান দিন। বার, মাস, তারিখ এভাবে সাজানো। যেমন: Sun July 18।     |
| \h                 | ডোমেইন নেম ছাড়া কম্পিউটারের হোস্টনেম।                             |
| \H                 | সম্পূর্ণ হোস্টনেম।                                                |
| \j                 | বর্তমান শেলে চালু থাকা জবের সংখ্যা।                               |
| \l                 | টার্মিনাল ডিভাইসের নাম।                                           |
| \n                 | নতুন লাইন তৈরী করে।                                               |
| \r                 | ক্যারিজ রিটার্ন। নতুন লাইনের শুরুতে আসে।                          |
| \s                 | শেল প্রোগ্রামের নাম।                                              |
| \t                 | বর্তমান সময়। ২৪ঘন্টার হিসেবে। লেখা হয় এভাবে: ঘন্টা:মিনিট:সেকেন্ড। |
| \T                 | বর্তমান সময় ১২ঘন্টার হিসেবে।                                      |
| \\@                | বর্তমান সময় ১২ঘন্টার হিসেবে AM/PM সহ।                             |
| \A                 | বর্তমান সময় ২৪ঘন্টার হিসেবে কিন্তু সেকেন্ড বাদে।                  |
| \u                 | বর্তমার ইউজারের ইউজারনেম।                                         |
| \v                 | শেলের ভার্শন নাম্বার।                                             |
| \V                 | শেলের ভার্শন এবং রিলিজ নাম্বার।                                   |
| \w                 | বর্তমান ওয়ার্কিং ডিরেক্টরি।                                       |
| \W                 | বর্তমান ওয়ার্কিং ডিরেক্টরির শেষাংশ।                               |
| !                  | বর্তমান কমান্ডের হিস্ট্রি নাম্বার।                                |
| #                  | এই শেল সেশনে ব্যবহৃত কমান্ড সংখ্যা।                               |
| $                  | সুপারইউজার হলে # চিহ্ন দেখাবে, নাহলে $ চিহ্ন।                     |
| \[                 | একাধিক ননপ্রিন্টিং ক্যারেক্টার শুরুর ব্র্যাকেট।                   |
| ]                  | একাধিক ননপ্রিন্টিং ক্যারেক্টার শেষের ব্র্যাকেট।                   |

এবার হয়ত আপনার কাছে সব পরিষ্কার। আমাদের প্রম্পটে ৪টি এস্কেপ ক্যারেক্টার ছিল। এগুলো হল:

* **\u**: এটি দিয়ে ইউজারনেম বোঝানো হয় তাই আপনার ইউজারনেম দেখায়।
* **\h**: এটি দিয়ে হোস্টনেম।
* **\W**: এটি বর্তমান ওয়ার্কিং ডিরেক্টরির শেষাংশের জন্য। এর বদলে \w ব্যবহার করা যেত কিন্তু তাতে পুরো পাথ দেখাতো বলে স্ক্রীনে অনেকটা জায়গা নষ্ট হত।
* **$**: এটি শেলের ধরনের জন্য।

## হাতে কলমে

এবার আমরা প্রম্পট নিয়ে কিছুক্ষণ পরীক্ষা চালাবো। এতে বারোটা বাজতেই পারে প্রম্পটের। তারজন্য আগে আমরা প্রম্পটটির একটি কপি রাখবো:

```
me@howtocode-pc:~$ ps1_old="$PS1"
me@howtocode-pc:~$ echo $ps1_old
\u@\h:\W\$
```

আমরা PS1 এর মান ps1\_old এ কপি করে রাখলাম। এটা হয়েছে নিশ্চিত হতে আমরা `echo $ps1_old` দিয়েছি। আমরা যদি পরবর্তীতে যেকোনো সময় পুরনো প্রম্পটি ফিরে পেতে চাই তা করতে পারি এভাবে: `PS1 = "$ps1_old"`।

এবার শুরু করা যাক। প্রথমে এটা:

```
me@howtocode-pc:~$ PS1=
PS1=
```

আমরা প্রম্পটের কোনো মানই দিইনি। যার ফলে পরের লাইনে PS1= দেখিয়েছে। তার পরের লাইনে প্রম্পট আছে কিন্তু এর কোনো লেখা নেই। এবার এটা চেষ্টা করি:

```
PS1="\$ "
PS1="\$ "
$
```

পরের লাইনে যথারীতি PS1 এর মান দেখিয়েছে। কিন্তু তারপরের লাইনে এবার আমরা প্রম্পট দেখতে পাচ্ছি। যা কিনা শুধুমাত্র $ চিহ্ন। যদি আমরা চাই যে প্রত্যেকবার প্রম্পট আসার সময় একটা বেল দেবে সেটা করতে পারি এভাবে:

```
$ PS1="\[\a\]\$ "
$
```

টার্মিনালে অডিও বেল এনাবেল করা থাকলে এখন থেকে বীপ শব্দ শোনা যাবে। এখন প্রশ্ন হল \[ এবং ] কেন ব্যবহার করা হল। এদুটি দিয়ে আমরা \aকে আবদ্ধ করেছি কারন \a ননপ্রিন্টিং ক্যারেক্টার। অর্থাৎ এটি প্রিন্ট হবে না স্ক্রীনে এবং কার্সর সরবে না। প্রম্পটে এরকম কিছু লিখে এই ননপ্রিন্টিং ব্রাকেট দিয়ে আবদ্ধ করতে হয়। এবার একটি তথ্যসমৃদ্ধ প্রম্পট বানাতে চেষ্টা করি যা আসলে কাজে লাগবে:

```
$ PS1="\A \h \$ "
09:57 howtocode-pc $
```

সময় কখনো কখনো কাজে লাগতে পারে যখন একাধিক কাজ কোনটা কখন করছি সেটা জেনে রাখা দরকার হয়। এবার আমরা মোটামুটি কাজের একটা প্রম্পট বানাবো:

```
9:57 howtocode-pc $ PS1="\@ \u@\h->[\W]{\!}\$ "
10:03 AM me@howtocode-pc->[~]{86}$
```

আমরা প্রথম \\@ দিয়ে AM/PM এর হিসেবে সময় দিয়েছি। তারপর আমাদের ইউজারনেম এবং হোস্টনেম @ যার মাঝখানে। তারপর -> দিয়ে \[] এর মধ্যে \W দিয়ে বর্তমান ওয়ার্কিং ডিরেক্টরির শেষাংশ এবং {} এর মধ্যে ! দিয়ে হিস্ট্রি নম্বর। এবং সবার শেষে $ দিয়ে শেল মোড।

## প্রম্পট সেভ করা

এটা একদমই সহজ কাজ। প্রম্পট সেট করার জন্য যে কমান্ডটি আমরা দিয়েছি .bashrc ফাইলের একদম শেষে সেটি যোগ করে দিলে সবসময়ই এরকম প্রম্পট পাওয়া যাবে। আমরা টেক্সট এডিটরে ফাইলটি খুলবো এবং কমান্ডটি একদম শেষে লিখে সেভ দেবো।

এখনি আমরা সেভ করা প্রম্পটের ফলাফল দেখতে চাইলে আমাদের `source ~/.bashrc` কমান্ডটি দিতে হবে।
