সরাসরি পর্বে যান
পর্ব ২৯ · ৫৫-এর মধ্যে · মডিউল ৪

কমান্ড লাইন — PowerShell আর Linux টার্মিনাল

The Command Line — PowerShell & the Linux Terminal

Taught in Bangla, this lesson introduces the command line in PowerShell and the Linux terminal: terminal, shell and console, the structure of a command with options and arguments, navigating with pwd, ls and cd, creating, copying, moving, deleting and reading files, pipes and redirection, system and network commands, permissions and PATH, scripts, WSL and SSH, and caution before pasting commands.

এই পর্বে যা শিখবেন

  • কমান্ড লাইন কেন আজও দরকারি, আর terminal, shell, console-এর পার্থক্য
  • একটি কমান্ড পড়তে পারা — command, option, argument, prompt আর working directory
  • PowerShell আর bash দুটোতেই ফোল্ডারে ঘোরা, ফাইল বানানো-কপি-সরানো-মোছা, খোঁজা আর সাহায্য নেওয়া
  • Wildcard, pipe আর redirection দিয়ে ছোট টুল জুড়ে বড় কাজ; নেটওয়ার্ক ও প্রসেসের কয়েকটি কমান্ড
  • PATH, sudo, package manager, ছোট একটি স্ক্রিপ্ট, WSL আর SSH — আর AI-এর দেওয়া কমান্ড নিরাপদে যাচাই করা

১ · কমান্ড লাইন কেন — লিখে লিখে কম্পিউটারের সাথে কথা

একটি দৃশ্য ভাবুন। তানভীর একটি ছোট অনলাইন দোকান চালান। প্রতি সপ্তাহে ফোন থেকে ৩০০-৪০০টি পণ্যের ছবি কম্পিউটারে নামান, আর প্রতিটির নাম বদলে তারিখ অনুযায়ী আলাদা ফোল্ডারে রাখেন। মাউস দিয়ে এই কাজে লাগে পুরো একটি বিকেল। তাঁর এক বন্ধু এসে কালো একটি জানালায় কয়েক লাইন লিখলেন, Enter চাপলেন — আর তিন সেকেন্ডে সব ছবি ঠিক জায়গায় চলে গেল। পরের সপ্তাহে তানভীর নিজেই সেই কয়েক লাইন আবার চালালেন।

ওই কালো জানালাটিই কমান্ড লাইন (Command Line Interface, CLI). পর্ব ০৬-এ দেখেছেন, অপারেটিং সিস্টেমকে নির্দেশ দেওয়ার দুটি পথ আছে — ছবি আর মাউসের GUI, আর কিবোর্ডে লেখা কমান্ডের CLI. এই পর্ব পুরোটাই দ্বিতীয় পথ নিয়ে।

ইতিহাসের দিক থেকে CLI-ই আগে এসেছে। ১৯৬০-এর দশকে আর সত্তরের দশকের শুরুতে বেশিরভাগ কম্পিউটারের সামনে কোনো পর্দাই থাকত না — থাকত টাইপরাইটারের মতো একটি যন্ত্র। আপনি টাইপ করতেন, কম্পিউটার কাগজে উত্তর ছাপত। পরে এলো পর্দা, তারপর আশির দশকে মাউস আর উইন্ডো। কিন্তু অবাক করা ব্যাপার হলো, আজও বিশ্বের বেশিরভাগ সার্ভার, ক্লাউড আর প্রোগ্রামারের কাজ চলে মূলত কমান্ড লাইনে। কেন?

নির্ভুল

“এই ফোল্ডারের যত PDF, ৫ MB-এর বড়, গত মাসে বদলানো” — এমন নির্দিষ্ট কাজ এক লাইনে বলা যায়। মাউসে এটি অনেক খোঁজাখুঁজির ব্যাপার।

বারবার চালানো যায়

একবার লেখা কমান্ড কপি করে রাখা যায়, পরের মাসে হুবহু আবার চালানো যায়, সহকর্মীকে পাঠানো যায়। ক্লিকের ক্রম এভাবে পাঠানো কঠিন।

স্বয়ংক্রিয় করা যায়

কয়েকটি কমান্ড একটি ফাইলে লিখে রাখলে হয় স্ক্রিপ্ট — রোজ রাত ২টায় নিজে নিজে ব্যাকআপ নেবে, আপনি ঘুমিয়ে থাকলেও।

পর্দা ছাড়াও চলে

ডেটা সেন্টারের সার্ভারে মনিটর, মাউস কিছুই নেই। হাজার কিলোমিটার দূর থেকে লেখা কমান্ড পাঠিয়েই সেগুলো চালাতে হয়।

রেস্তোরাঁয় খাবার অর্ডারের দুটি উপায় ভাবুন। একটি হলো ছবিওয়ালা মেনু — আঙুল দিয়ে দেখিয়ে দিলেই হলো; নতুন অতিথির জন্য দারুণ। এটি GUI. আরেকটি হলো নিয়মিত খদ্দেরের মতো ওয়েটারকে এক নিঃশ্বাসে বলা — “দুটো কাচ্চি, একটায় আলু বেশি, বোরহানি ঠান্ডা, বিল আলাদা”। শিখতে একটু সময় লাগে, কিন্তু একবার শিখলে দ্রুত, নির্দিষ্ট, আর প্রতি শুক্রবার একই অর্ডার হুবহু দেওয়া যায়। এটি CLI.

ভয় পাওয়ার কিছু নেই। পেশাদারেরাও প্রতিদিন মাত্র ২০-৩০টি কমান্ড ঘুরিয়ে-ফিরিয়ে ব্যবহার করেন। এই পর্বে ঠিক সেগুলোই শিখবেন — Windows-এর PowerShell আর Linux-এর bash, পাশাপাশি। একটি শিখলে অন্যটি অনেক সহজ হয়ে যায়।

২ · Terminal, shell আর console — কে কী

নতুনদের সবচেয়ে বেশি গোলমাল লাগে এই তিনটি শব্দে, কারণ লোকে এগুলো প্রায় একই অর্থে বলে। আসলে এদের কাজ আলাদা:

  • Terminal হলো জানালা — যেখানে আপনি লেখেন আর লেখা আকারে উত্তর দেখেন। এটি কিবোর্ডের চাপ নেয়, অক্ষর আঁকে, রং দেখায়, কপি-পেস্ট সামলায়। Windows 11-এ এর নাম Windows Terminal; Ubuntu-তে Terminal; Mac-এ Terminal বা iTerm2.
  • Shell হলো জানালার ভেতরের দোভাষী — একটি প্রোগ্রাম, যা আপনার লেখা লাইন পড়ে, বোঝে, দরকারি প্রোগ্রাম চালায় আর ফল ফেরত দেয়। নাম “shell” (খোলস), কারণ এটি অপারেটিং সিস্টেমের কেন্দ্র — kernel — ঘিরে থাকা বাইরের স্তর, যার মধ্য দিয়ে মানুষ ভেতরে কথা পাঠায়।
  • Console শব্দটি পুরোনো — একসময় কম্পিউটারের সাথে লাগানো আসল কিবোর্ড-পর্দার টেবিলটিকে বলা হতো। আজ সাধারণ কথায় এটি terminal-এর প্রায় সমার্থক।

মোবাইলে bKash অ্যাপের কথা ভাবুন। ফোনের পর্দা আর কিবোর্ড হলো terminal — আপনি যা লেখেন আর যা দেখেন। আর পেছনের যে ব্যবস্থা আপনার “Send Money, ০১৭…, ৫০০ টাকা” বুঝে আসল লেনদেনটি করায়, সেটি shell-এর মতো। একই ফোনে অন্য অ্যাপ খুললে একই পর্দায় অন্য “দোভাষী” কাজ করে — তেমনি একই Windows Terminal-এ PowerShell, cmd বা Linux-এর bash — যেকোনোটি খোলা যায়।

কোন কম্পিউটারে কোন shell

Shellকোথায়বৈশিষ্ট্যPrompt দেখতে যেমন
PowerShellWindows (Linux ও Mac-এও চলে)আধুনিক; কমান্ডের নাম Get-…, Set-… ধাঁচের; লেখার বদলে object পাঠায়PS C:\Users\Rina>
cmd (Command Prompt)WindowsMS-DOS-এর উত্তরসূরি; পুরোনো, সরল; dir, copy, delC:\Users\Rina>
bashবেশিরভাগ Linux, WSLসার্ভার আর প্রোগ্রামারদের জগতে সবচেয়ে প্রচলিতrina@laptop:~$
zshmacOS-এর ডিফল্ট (২০১৯ থেকে)bash-এর মতোই, কিছু বাড়তি সুবিধাrina@MacBook ~ %

খুলবেন কীভাবে? Windows 11-এ Start বোতামে ডান-ক্লিক → Terminal; অথবা Win চেপে “terminal” লিখে Enter. সাধারণত PowerShell খোলে, ওপরের ⌄ চিহ্ন থেকে অন্য shell বাছা যায়। Ubuntu-তে Ctrl+Alt+T. Mac-এ Cmd+Space চেপে “Terminal”.

পর্দায় যা দেখবেন, সেটিই prompt. PS C:\Users\Rina> মানে: “আমি PowerShell, এখন আছি C:\Users\Rina ফোল্ডারে, আপনার কমান্ডের অপেক্ষায়।” Linux-এর rina@laptop:~$ মানে: ব্যবহারকারী rina, কম্পিউটারের নাম laptop, আছেন ~ (নিজের হোম ফোল্ডার)-এ, আর $ মানে সাধারণ ব্যবহারকারী। শেষ চিহ্নটি # হলে সাবধান — আপনি সর্বোচ্চ ক্ষমতার root ব্যবহারকারী। এই পর্বের উদাহরণে prompt-এর পরের অংশটিই আপনি লিখবেন; prompt নিজে লিখবেন না।

৩ · একটি কমান্ডের গঠন — command, option আর argument

বাংলা বাক্যে যেমন ক্রিয়া, বিশেষণ আর কর্ম থাকে — “দেখাও, বিস্তারিতভাবে, docs ফোল্ডারটি” — প্রতিটি কমান্ডেও তেমনি তিনটি অংশ। শব্দগুলোর মাঝে থাকে স্পেস, আর এই স্পেস দেখেই shell অংশগুলো আলাদা করে। “পরে” চেপে একটি কমান্ড ভেঙে দেখুন:

ls -l -h Documents
  1. ls — কমান্ড, অর্থাৎ ক্রিয়া। “list” শব্দের সংক্ষেপ: “তালিকা দেখাও”। লাইনের প্রথম শব্দটি সবসময় কমান্ড — shell এই নামের প্রোগ্রামটিই খুঁজে চালাবে।
  2. -l — option (flag). হাইফেন দিয়ে শুরু — অর্থাৎ এটি কাজের ধরন বদলায়, কাজের বস্তু নয়। -l মানে long: শুধু নাম নয়, সাথে আকার, তারিখ আর অনুমতিও দেখাও।
  3. -h — আরেকটি option. human-readable: আকার 2048000-এর বদলে 2.0M হিসেবে দেখাও। অনেক কমান্ডে ছোট option জোড়া লাগানো যায় — ls -lh লিখলেও একই কাজ। লম্বা রূপও আছে দুই হাইফেনে, যেমন --help.
  4. Documents — argument, অর্থাৎ কর্ম। কোন জিনিসের ওপর কাজ হবে। না দিলে ls বর্তমান ফোল্ডারের তালিকা দেখায়। পুরো বাক্য: “Documents ফোল্ডারের তালিকা দেখাও, বিস্তারিত, মানুষের পড়ার মতো আকারে।” PowerShell-এ একই কাজ: Get-ChildItem Documents — সেখানে option লেখা হয় নাম ধরে, যেমন -Recurse, -Force.

এই কমান্ডের প্রত্যাশিত আউটপুট হবে এমন কিছু (তারিখ আর নাম আপনার কম্পিউটারে আলাদা হবে):

$ ls -lh Documents
-rw-r--r-- 1 rina rina 2.0M Oct 12 10:41 admit-card.pdf
-rw-r--r-- 1 rina rina  18K Oct 15 21:03 cv-rina.docx
drwxr-xr-x 2 rina rina 4.0K Oct 16 09:12 HSC

প্রথম অক্ষর d মানে ফোল্ডার (directory), - মানে সাধারণ ফাইল। পরের rwx-গুলো হলো কে পড়তে (read), লিখতে (write) আর চালাতে (execute) পারবে — এই অনুমতির ব্যবস্থা পর্ব ২৬-এ ভেতর থেকে দেখেছেন।

কয়েকটি সোনালি নিয়ম

  • বানান হুবহু। GUI-তে ভুল আইকনে ক্লিক করার সুযোগ কম; CLI-তে sl লিখলে কম্পিউটার বুঝবে না আপনি ls বোঝাতে চেয়েছেন। Linux-এ বড়-ছোট অক্ষরও আলাদা — Documents আর documents দুটি আলাদা ফোল্ডার। PowerShell বড়-ছোট অক্ষরে তেমন কড়া নয়।
  • নামে স্পেস থাকলে উদ্ধৃতিচিহ্ন। cd My Files লিখলে shell ভাববে দুটি argument: “My” আর “Files”. লিখুন cd "My Files". এজন্যই পর্ব ০৬-এ ফাইলের নামে স্পেসের বদলে হাইফেন দিতে বলা হয়েছিল।
  • Tab আপনার বন্ধু। নামের প্রথম কয়েকটি অক্ষর লিখে Tab চাপলে shell বাকিটা নিজেই পূরণ করে — টাইপের ভুল প্রায় শূন্য। ↑ চাপলে আগের কমান্ড ফিরে আসে।
  • আটকে গেলে Ctrl+C. কমান্ড লাইনে এটি কপি নয় — চলমান কমান্ড থামানোর সংকেত। (Windows Terminal-এ লেখা বাছাই করা থাকলে অবশ্য কপিই করে।)

Enter চাপার পর ভেতরে কী ঘটে

আপনি notepad বা ls লিখে Enter চাপলেন। এক মুহূর্তে কয়েকটি ঘটনা পরপর ঘটে:

  1. আপনি লেখেনls -l docsতারপর Enter
  2. Shell ভাঙেls | -l | docsশব্দে শব্দে আলাদা
  3. PATH-এ খোঁজে/usr/bin/lsপ্রোগ্রাম কোথায়?
  4. OS চালায়নতুন প্রসেসRAM-এ, নিজস্ব PID
  5. আউটপুটcv.pdf notes.txtপর্দায় লেখা
  6. আবার prompt$পরের কমান্ডের অপেক্ষা
  1. আপনি লেখেন। Terminal প্রতিটি অক্ষর পর্দায় দেখায় আর shell-এর কাছে পাঠায়। Enter চাপা মানে “লাইন শেষ, এবার কাজ করো।”
  2. Shell লাইনটি ভাঙে (parse). স্পেস ধরে শব্দ আলাদা করে, উদ্ধৃতিচিহ্ন মানে “এটা একটাই শব্দ” বোঝে, *.pdf-এর মতো বিশেষ চিহ্ন থাকলে আসল ফাইলের নাম বসায়, ~ থাকলে হোম ফোল্ডারের ঠিকানা বসায়। প্রথম শব্দ ls হলো কমান্ড।
  3. প্রোগ্রামটি খোঁজে। cd-এর মতো কিছু কমান্ড shell নিজের ভেতরেই জানে (built-in). বাকিগুলোর জন্য সে PATH নামের একটি তালিকার ফোল্ডারগুলো একে একে খোঁজে — ls পায় /usr/bin/ls-এ। কোথাও না পেলে এখানেই থেমে বলে “command not found”.
  4. অপারেটিং সিস্টেম প্রোগ্রামটি চালায়। Shell নিজে প্রোগ্রাম চালাতে পারে না — সে OS-কে অনুরোধ করে। OS প্রোগ্রামটিকে RAM-এ এনে একটি নতুন প্রসেস বানায়, একটি নম্বর (PID) দেয়, আর argument-গুলো (-l, docs) হাতে ধরিয়ে দেয়। প্রসেস কীভাবে তৈরি ও পরিচালিত হয়, পর্ব ২৬-এ বিস্তারিত।
  5. প্রোগ্রাম তার ফল পাঠায়। ফলাফল যায় একটি নির্দিষ্ট পথে — standard output — যা সাধারণত terminal-এর পর্দায় এসে পড়ে। ভুলের বার্তা যায় আলাদা আরেকটি পথে (standard error). একটু পরে দেখবেন, এই পথ ঘুরিয়ে ফাইলে বা অন্য প্রোগ্রামে পাঠানো যায়।
  6. আবার prompt. প্রোগ্রাম শেষ হলে OS প্রসেসটি সরিয়ে ফেলে, আর shell নতুন prompt দেখিয়ে পরের কমান্ডের অপেক্ষা করে। পুরো চক্র: পড়ো → বোঝো → চালাও → দেখাও → আবার পড়ো. প্রোগ্রামারেরা একে বলেন REPL (Read–Eval–Print Loop).

৪ · ফোল্ডারে ঘোরা — pwd, ls, cd আর path

File Explorer-এ আপনি একটি ফোল্ডার খুলে তার ভেতরে থাকেন। কমান্ড লাইনেও তেমনি আপনি সবসময় কোনো একটি ফোল্ডারে “দাঁড়িয়ে” থাকেন — একে বলে working directory (বর্তমান ফোল্ডার)। শুধু ফাইলের নাম লিখলে shell সেটি এই ফোল্ডারেই খোঁজে। ঘোরাঘুরির জন্য তিনটি কমান্ডই যথেষ্ট:

প্রশ্নbash (Linux/Mac)PowerShellcmd
আমি কোথায়?pwd (print working directory)Get-Location (বা pwd)cd
এখানে কী কী আছে?lsGet-ChildItem (বা ls, dir)dir
অন্য ফোল্ডারে যাওcd নামcd নাম (আসল নাম Set-Location)cd নাম

খেয়াল করুন, PowerShell-এ ls, dir, pwd, cd লিখলেও কাজ করে — এগুলো আসল কমান্ডের ডাকনাম (alias), Linux আর cmd থেকে আসা মানুষের সুবিধার জন্য। এবার একটি ফোল্ডার-ট্রিতে ঘুরে দেখুন। prompt কীভাবে বদলাচ্ছে, খেয়াল রাখুন:

ধাপ ১ · আমি কোথায়?working directory = ~
rina@laptop:~$ pwd
/home/rina

ফোল্ডার-ট্রি:
/home/rina   ◀ আপনি এখানে
├─ Documents
│  └─ HSC
│     └─ ICT
├─ Downloads
└─ Pictures
ধাপ ২ · এখানে কী আছে?working directory = ~
rina@laptop:~$ ls
Documents  Downloads  Pictures

ফোল্ডার-ট্রি:
/home/rina   ◀ আপনি এখানে
├─ Documents
├─ Downloads
└─ Pictures
ধাপ ৩ · relative path দিয়ে নামাcd Documents/HSC
rina@laptop:~$ cd Documents/HSC
rina@laptop:~/Documents/HSC$ ls
ICT

ফোল্ডার-ট্রি:
/home/rina
├─ Documents
│  └─ HSC    ◀ আপনি এখানে
│     └─ ICT
ধাপ ৪ · .. দিয়ে এক ধাপ ওপরেcd ..
rina@laptop:~/Documents/HSC$ cd ..
rina@laptop:~/Documents$ pwd
/home/rina/Documents

ফোল্ডার-ট্রি:
/home/rina
├─ Documents ◀ আপনি এখানে
│  └─ HSC
ধাপ ৫ · absolute path দিয়ে লাফcd /home/rina/Pictures
rina@laptop:~/Documents$ cd /home/rina/Pictures
rina@laptop:~/Pictures$ pwd
/home/rina/Pictures
ধাপ ৬ · ~ দিয়ে ঘরে ফেরাcd ~
rina@laptop:~/Pictures$ cd ~
rina@laptop:~$ pwd
/home/rina
(শুধু cd লিখলেও bash হোম ফোল্ডারে নিয়ে যায়)
  1. pwd — আমি কোথায়? Terminal খুললে আপনি সাধারণত থাকেন নিজের হোম ফোল্ডারে — Linux-এ /home/rina, Windows-এ C:\Users\Rina. Prompt-এ এটিকে সংক্ষেপে ~ দেখায়।
  2. ls — চারপাশে কী আছে? শুধু বর্তমান ফোল্ডারের তালিকা। ভেতরের ফোল্ডারের ভেতরে কী আছে, তা দেখায় না — যেমন File Explorer-এ ফোল্ডার না খুললে ভেতরটা দেখা যায় না।
  3. cd Documents/HSC — দুই ধাপ নিচে। ঠিকানাটি শুরু হয়েছে / ছাড়া, তাই এটি relative path — “এখান থেকে Documents, তার ভেতরে HSC”. Prompt বদলে ~/Documents/HSC হলো — কোনো বার্তা আসেনি, কারণ সফল কমান্ড সাধারণত চুপচাপ থাকে।
  4. cd .. — এক ধাপ ওপরে। দুটি বিন্দু .. মানে “আমার ওপরের ফোল্ডার” (parent), আর একটি বিন্দু . মানে “এই ফোল্ডারটিই”। cd ../.. লিখলে দুই ধাপ ওপরে। Windows-এও হুবহু একই নিয়ম।
  5. cd /home/rina/Pictures — পূর্ণ ঠিকানায় লাফ। / দিয়ে শুরু, তাই এটি absolute path — যেখানেই থাকুন, সবসময় একই জায়গা বোঝায়। Windows-এ absolute path শুরু হয় ড্রাইভ দিয়ে: cd C:\Users\Rina\Pictures. পর্ব ০৬-এর ঠিকানা-পড়ার নিয়ম এখানে সরাসরি কাজে লাগছে।
  6. cd ~ — যেখানেই থাকুন, ঘরে ফেরা। ~ (tilde) হলো হোম ফোল্ডারের ডাকনাম। PowerShell-এও cd ~ কাজ করে। আর cd - (bash) আপনাকে ঠিক আগের ফোল্ডারে ফিরিয়ে নেয় — দুটি ফোল্ডারের মধ্যে আসা-যাওয়ায় খুব কাজের।
মূল ধারণা

Absolute path হলো পূর্ণ ডাক-ঠিকানা — “বাড়ি ১২, রোড ৫, ধানমন্ডি, ঢাকা” — যে কেউ যেখান থেকেই পড়ুক, একই বাড়ি। Relative path হলো পথ-নির্দেশ — “এখান থেকে বাঁয়ে দুটো বাড়ি পরে” — কোথায় দাঁড়িয়ে বলছেন তার ওপর অর্থ বদলায়। স্ক্রিপ্টে সাধারণত absolute path নিরাপদ; হাতে কাজ করার সময় relative path দ্রুত।

নিজে চালিয়ে দেখুন — একটি ছোট্ট shell সিমুলেটর

নিচের প্রোগ্রামটি একটি নকল ফোল্ডার-ট্রির ওপর পাঁচটি কমান্ড বোঝে: pwd, ls, cd, mkdir, cat. শেষ লাইনে কমান্ডের একটি তালিকা আছে — “চালান” চাপুন, তারপর তালিকা বদলে আবার চালান। আসল কম্পিউটারের কিছুই এতে বদলাবে না।

const tree = { "/home/rina": ["docs/", "photos/", "todo.txt"],
  "/home/rina/docs": ["cv.pdf", "notes.txt"], "/home/rina/photos": [] };
const texts = { "/home/rina/todo.txt": "Buy rice, lentils; recharge phone",
  "/home/rina/docs/notes.txt": "ICT: CLI vs GUI, pwd, ls, cd" };
let cwd = "/home/rina";
function run(line) {
  const [cmd, arg] = line.split(" ");
  console.log(`rina:${cwd}$ ${line}`);
  const p = !arg ? cwd : arg === ".." ? cwd.slice(0, cwd.lastIndexOf("/"))
          : arg.startsWith("/") ? arg : cwd + "/" + arg;
  if (cmd === "pwd") console.log(cwd);
  else if (cmd === "ls") console.log(tree[p] ? tree[p].join("  ") || "(empty)" : "ls: " + arg + ": No such file or directory");
  else if (cmd === "cd") { if (tree[p]) cwd = p; else console.log("cd: " + arg + ": No such file or directory"); }
  else if (cmd === "mkdir") { tree[p] = []; tree[cwd].push(arg + "/"); }
  else if (cmd === "cat") console.log(texts[p] ?? "cat: " + arg + ": No such file or directory");
  else console.log(cmd + ": command not found");
}
["pwd", "ls", "cd docs", "ls", "cat notes.txt", "cd ..", "mkdir music", "ls",
 "cd games", "ls photos", "Get-ChildItem"].forEach(run);

আউটপুটের প্রথম দিকে আসে /home/rina, তারপর docs/ photos/ todo.txt; cd docs-এর পর prompt হয় rina:/home/rina/docs$, আর cat notes.txt দেখায় ICT: CLI vs GUI, pwd, ls, cd. mkdir music-এর পর তালিকায় যোগ হয় music/. ভুল ফোল্ডারে যেতে চাইলে আসে cd: games: No such file or directory, খালি ফোল্ডারে (empty), আর শেষে Get-ChildItem: command not found — কারণ এটি PowerShell-এর কমান্ড, bash-এর নয়। লক্ষ করুন, প্রোগ্রামটি প্রতিটি নামকে বর্তমান ফোল্ডারের সাথে জুড়ে পূর্ণ ঠিকানা বানায় — relative path থেকে absolute path — ঠিক যেমন আসল shell করে। (শেখার জন্য সরল সংস্করণ; আসল shell এর চেয়ে অনেক বেশি কিছু সামলায়।)

৫ · ফাইল নিয়ে কাজ — বানানো, কপি, সরানো, মোছা আর পড়া

পর্ব ০৬-এ মাউস দিয়ে যা যা করেছিলেন, এবার লিখে করবেন। নিচের প্রতিটি কমান্ড নিজের কম্পিউটারে একটি আলাদা “অনুশীলন” ফোল্ডারে চালিয়ে দেখুন — জরুরি ফাইলের পাশে নয়।

mkdir practice            # নতুন ফোল্ডার
cd practice
touch notes.txt           # খালি ফাইল বানানো
echo "ICT class 29" > notes.txt   # ফাইলে এক লাইন লেখা
cp notes.txt backup.txt   # কপি: notes.txt থেকে backup.txt
mv backup.txt old.txt     # নাম বদল (বা অন্য ফোল্ডারে সরানো)
cat notes.txt             # ফাইলের লেখা দেখা
rm old.txt                # মোছা — Recycle Bin নেই!
ls

প্রত্যাশিত আউটপুট (cat আর শেষ ls-এর):

ICT class 29
notes.txt
mkdir practice                         # New-Item -ItemType Directory
cd practice
New-Item notes.txt                     # খালি ফাইল বানানো
Set-Content notes.txt "ICT class 29"   # ফাইলে এক লাইন লেখা
Copy-Item notes.txt backup.txt         # ডাকনাম: cp, copy
Move-Item backup.txt old.txt           # ডাকনাম: mv, move
Get-Content notes.txt                  # ডাকনাম: cat, type
Remove-Item old.txt                    # ডাকনাম: rm, del — Recycle Bin নেই!
Get-ChildItem

প্রত্যাশিত আউটপুট: New-Item নতুন ফাইলের একটি ছোট বিবরণ দেখাবে; Get-Content দেখাবে ICT class 29; শেষে Get-ChildItem-এর টেবিলে (Mode, LastWriteTime, Length, Name) শুধু notes.txt থাকবে।

# চিহ্নের পরের লেখা হলো মন্তব্য (comment) — shell সেটি উপেক্ষা করে; শুধু আপনার বোঝার জন্য। ফোল্ডারসহ পুরোটা কপি করতে bash-এ cp -r Photos /media/pendrive/ (-r = recursive, ভেতরের সবকিছুসহ), PowerShell-এ Copy-Item Photos E:\ -Recurse.

rm আর Recycle Bin — সবচেয়ে জরুরি সতর্কতা

কমান্ড লাইনে মোছা মানে সত্যিই মোছা। rm (bash), Remove-Item (PowerShell) বা del (cmd) ফাইলকে Recycle Bin-এ পাঠায় না, আর “আপনি কি নিশ্চিত?” জিজ্ঞেসও করে না। Undo বলে কিছু নেই। আর rm -r ফোল্ডার (PowerShell-এ Remove-Item ফোল্ডার -Recurse) ফোল্ডারের ভেতরের সব ফাইল, সব সাব-ফোল্ডার একসাথে মুছে দেয়; সাথে -f (force) থাকলে সতর্কবার্তাও দেখায় না। নিজেকে বাঁচানোর নিয়ম:

  • মোছার আগে একই নাম বা pattern দিয়ে ls চালিয়ে দেখুন ঠিক কোন ফাইলগুলো ধরা পড়ছে।
  • bash-এ rm -i প্রতিটি ফাইলের আগে জিজ্ঞেস করে; PowerShell-এ -WhatIf যোগ করলে কিছু না মুছে শুধু দেখায় কী মুছত, আর -Confirm প্রতিবার অনুমতি চায়।
  • pwd দিয়ে নিশ্চিত হোন আপনি ঠিক ফোল্ডারে আছেন। ভুল ফোল্ডারে rm * — এটিই সবচেয়ে প্রচলিত দুর্ঘটনা।
  • জরুরি ফাইলের ব্যাকআপ রাখুন। কোনো সতর্কতাই ব্যাকআপের বিকল্প নয়।

কেন এমন? Recycle Bin আসলে GUI-এর একটি সুবিধা — File Explorer “মোছা” মানে ফাইলটিকে একটি বিশেষ লুকানো ফোল্ডারে সরিয়ে রাখা। কমান্ড লাইনের টুলগুলো তৈরি হয়েছিল তার অনেক আগে, আর এমন মানুষের জন্য যাঁরা স্ক্রিপ্টে হাজার ফাইল মুছবেন — প্রতিবার প্রশ্ন করলে স্বয়ংক্রিয় কাজ অচল হয়ে যেত। তাই এই টুলগুলো সরাসরি OS-কে বলে ফাইলটির তালিকা-এন্ট্রি সরিয়ে দিতে।

ফাইল পড়া — cat, less, head, tail

  • cat file.txt (PowerShell: Get-Content; cmd: type) — পুরো ফাইল একবারে দেখায়। ছোট ফাইলে ভালো।
  • less file.txt — বড় ফাইল পাতায় পাতায় পড়া; Space চাপলে পরের পাতা, / লিখে খোঁজা, q চাপলে বের হওয়া। PowerShell-এ কাছাকাছি: Get-Content file.txt | more.
  • head -n 5 log.txt / tail -n 5 log.txt — প্রথম বা শেষ ৫ লাইন। PowerShell: Get-Content log.txt -TotalCount 5 আর -Tail 5. সার্ভারের লগ ফাইলের শেষ লাইনগুলো দেখতে tail প্রতিদিনের কমান্ড।

Wildcard — এক কমান্ডে অনেক ফাইল

* মানে “যেকোনো সংখ্যক যেকোনো অক্ষর”, ? মানে “ঠিক একটি অক্ষর”। তাই ls *.pdf দেখায় সব PDF; cp IMG_2026*.jpg ~/Pictures/ কপি করে ২০২৬ সালের নামওয়ালা সব ছবি; ls report-?.docx ধরে report-1.docx, report-9.docx বা report-A.docx-এর মতো নাম (মাঝে ঠিক একটি অক্ষর), কিন্তু report-10.docx নয়। PowerShell-এও একই চিহ্ন কাজ করে: Get-ChildItem *.pdf. মনে রাখবেন, wildcard যত শক্তিশালী, rm-এর সাথে তত বিপজ্জনক — rm * .pdf (মাঝে ভুল করে একটি স্পেস) মানে “সব ফাইল মোছো, তারপর .pdf নামের ফাইলও মোছো”।

খোঁজা — find আর grep

কী খুঁজছেনbashPowerShell
নাম দিয়ে ফাইল, সব সাব-ফোল্ডারেfind . -name "*.pdf"Get-ChildItem -Recurse -Filter *.pdf
ফাইলের ভেতরের লেখায় একটি শব্দgrep "error" log.txtSelect-String "error" log.txt
সব ফাইলের ভেতরে, ফোল্ডার ধরেgrep -r "invoice" DocumentsGet-ChildItem Documents -Recurse | Select-String "invoice"

grep নামটি এসেছে পুরোনো Unix এডিটরের একটি কমান্ড g/re/p থেকে — “global / regular expression / print”, অর্থাৎ “সব লাইনে pattern খোঁজো, মিললে ছাপো”। -i দিলে বড়-ছোট অক্ষর উপেক্ষা করে।

সাহায্য নেওয়া — কমান্ড নিজেই নিজের বই

সব option মুখস্থ রাখার দরকার নেই। Linux-এ man ls (manual) পুরো নির্দেশিকা খোলে (q দিয়ে বের হন); অনেক কমান্ডে ls --help ছোট সারাংশ দেয়। PowerShell-এ Get-Help Copy-Item -Examples উদাহরণসহ দেখায় (প্রথমবার Update-Help চালাতে হতে পারে)। cmd-এ dir /?. পেশাদারেরাও প্রতিদিন এগুলো দেখেন — এটি দুর্বলতা নয়, অভ্যাস।

৬ · Pipe আর redirection — ছোট টুল জোড়া লাগানো

কমান্ড লাইনের আসল জাদু এখানে। প্রতিটি টুল একটি ছোট কাজ ভালোভাবে করে — ls তালিকা দেয়, grep ছাঁকে, wc গোনে, sort সাজায়। আর pipe চিহ্ন | দিয়ে এক টুলের আউটপুট সরাসরি পরের টুলের ইনপুটে ঢালা যায় — মাঝে কোনো ফাইল বানাতে হয় না। প্রশ্ন: “Downloads ফোল্ডারে কয়টি PDF আছে?” উত্তর এক লাইনে:

  1. ls৬টি নামতালিকা বানায়
  2. grep pdf৩টি নামছাঁকে
  3. wc -l3লাইন গোনে
  4. পর্দা3শুধু উত্তর
ls-এর আউটপুটpipe-এর ভেতরে প্রতি লাইনে একটি নাম
admit-card.pdf
cv-rina.pdf
IMG_0412.jpg
notes.txt
result.pdf
song.mp3
grep pdf-এর আউটপুট"pdf" আছে এমন লাইনই শুধু থাকে
admit-card.pdf
cv-rina.pdf
IMG_0412.jpg      ✗ বাদ
notes.txt         ✗ বাদ
result.pdf
song.mp3          ✗ বাদ
wc -l-এর আউটপুটword count, -l = শুধু লাইন
admit-card.pdf   → ১
cv-rina.pdf      → ২
result.pdf       → ৩
3
পর্দায় যা দেখবেনমাঝের সব ধাপ অদৃশ্য
rina@laptop:~/Downloads$ ls | grep pdf | wc -l
3

PowerShell-এ একই প্রশ্ন:
PS C:\Users\Rina\Downloads> (Get-ChildItem *.pdf).Count
3
  1. ls তালিকা বানায়। কিন্তু পর্দায় না পাঠিয়ে pipe-এ ঢালে। Pipe-এ পাঠালে ls প্রতি লাইনে একটি করে নাম লেখে — যাতে পরের টুল লাইন ধরে কাজ করতে পারে।
  2. grep pdf ছাঁকে। প্রতিটি লাইন পড়ে, যেখানে “pdf” লেখা আছে শুধু সেগুলো সামনে পাঠায়। ছাঁকনির মতো — চা ছাঁকলে পাতা থেকে যায়, শুধু লিকার নিচে নামে। (সাবধান: নামের মাঝে “pdf” থাকা অন্য ফাইলও ধরা পড়বে; আরও নির্দিষ্ট হতে grep '\.pdf$' লেখা হয়।)
  3. wc -l গোনে। wc মানে word count; -l বললে শুধু লাইন গোনে। তিনটি লাইন এলো, তাই উত্তর 3.
  4. পর্দায় শুধু উত্তর। তিনটি আলাদা প্রোগ্রাম একসাথে চলেছে, OS-এর তৈরি অদৃশ্য পাইপ দিয়ে ডেটা এক প্রসেস থেকে আরেকটিতে গেছে। PowerShell-এ pipe দিয়ে লেখা নয়, পুরো object যায় — প্রতিটি ফাইলের নাম, আকার, তারিখ আলাদা ঘরে। তাই সেখানে লেখা কাটাছেঁড়ার বদলে সরাসরি .Count বা Where-Object Length -gt 1MB লেখা যায়।

Redirection — পর্দার বদলে ফাইলে

Redirection দিয়ে আউটপুট পর্দার বদলে একটি ফাইলে পাঠানো যায়:

ls ~/Downloads > list.txt        # তালিকা list.txt-এ (আগের লেখা মুছে)
date >> log.txt                  # log.txt-এর শেষে আজকের তারিখ যোগ
sort names.txt | uniq > clean.txt  # সাজিয়ে, পরপর একই নাম বাদ দিয়ে, নতুন ফাইলে
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5   # PowerShell: সবচেয়ে বেশি CPU নেওয়া ৫টি প্রসেস

> আর >>-এর পার্থক্য মনে রাখুন। > ফাইলের আগের সব লেখা কোনো প্রশ্ন ছাড়াই মুছে নতুন লেখা বসায়; >> শেষে যোগ করে। রোজকার হিসাবের খাতায় ভুল করে > দিলে আগের মাসের সব হিসাব শেষ।

Pipe-এর ধারণা দেন Bell Labs-এর Doug McIlroy. ১৯৬৪ সালেই এক নোটে তিনি লিখেছিলেন, প্রোগ্রামগুলো বাগানের পানির পাইপের মতো জোড়া লাগানো যাওয়া উচিত। ১৯৭৩ সালে Ken Thompson Unix-এ | যোগ করেন। এর পরেই জন্ম নেয় তথাকথিত Unix দর্শন: “এমন প্রোগ্রাম লেখো যা একটি কাজ ভালোভাবে করে; এমন প্রোগ্রাম লেখো যা একে অপরের সাথে কাজ করতে পারে; লেখা (text) দিয়ে যোগাযোগ করো, কারণ সেটি সবাই বোঝে।”

৭ · সিস্টেম, নেটওয়ার্ক, অনুমতি আর PATH

কম্পিউটার আর নেটওয়ার্কের খোঁজখবর

জানতে চানWindowsLinuxকী দেখায়
আমার IP ঠিকানাipconfigip a (পুরোনো: ifconfig)প্রতিটি নেটওয়ার্ক-সংযোগের IP address; ipconfig router-এর ঠিকানাও (Default Gateway) দেখায়, Linux-এ সেটি দেখতে ip route
অন্য কম্পিউটারে পৌঁছাতে পারছি?ping google.comping -c 4 google.comছোট প্যাকেট পাঠিয়ে উত্তর আসতে কত মিলিসেকেন্ড লাগে
পথে কোন কোন router?tracert google.comtraceroute google.comগন্তব্য পর্যন্ত প্রতিটি “হপ”
কী কী প্রোগ্রাম চলছেtasklist / Get-Processps aux / topপ্রসেসের নাম, PID, মেমরি
আটকে যাওয়া প্রোগ্রাম বন্ধStop-Process -Name notepad (cmd: taskkill)kill 4123 (PID দিয়ে)Task Manager-এর “End task”-এর মতো
কম্পিউটারের পরিচয়systeminfouname -aOS-এর নাম, version, হার্ডওয়্যার

যেমন Windows-এ ping google.com-এর প্রত্যাশিত আউটপুট হবে এমন কিছু (ঠিকানা আর সময় আপনার সংযোগে আলাদা হবে):

Pinging google.com [142.250.x.x] with 32 bytes of data:
Reply from 142.250.x.x: bytes=32 time=38ms TTL=117
Reply from 142.250.x.x: bytes=32 time=41ms TTL=117
...
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss)

Windows চারবার পাঠিয়ে থামে; Linux-এ -c 4 না দিলে চলতেই থাকে — Ctrl+C দিয়ে থামান। “Request timed out” এলে হয় সংযোগ নেই, নয়তো গন্তব্যটি ping-এর উত্তর দেয় না (অনেক সার্ভার ইচ্ছা করেই দেয় না)। IP ঠিকানা, router আর এই প্যাকেটগুলো আসলে কী, তা পর্ব ৩২ আর ৩৩-এ বিস্তারিত দেখবেন। আর Get-Process/kill-এর পেছনে OS প্রসেস কীভাবে সামলায়, তা পর্ব ২৬-এ।

অনুমতি — sudo আর Run as administrator

পর্ব ০৬-এ দেখেছেন, Standard অ্যাকাউন্টে সিস্টেম বদলানো যায় না, তার জন্য Administrator-এর অনুমতি লাগে। কমান্ড লাইনেও একই নিয়ম। Linux-এ কোনো কমান্ডের আগে sudo (“superuser do”) লিখলে সেটি সর্বোচ্চ ক্ষমতা (root) নিয়ে চলে — আপনার পাসওয়ার্ড চায়। Windows-এ Terminal-এ ডান-ক্লিক করে Run as administrator দিয়ে খুলতে হয় (Windows 11-এর নতুন কিছু সংস্করণে sudo কমান্ডও যোগ হয়েছে, Settings থেকে চালু করতে হয়)।

sudo মানে “আমি জানি কী করছি — কোনো বাধা দিয়ো না।” সাধারণ অবস্থায় OS আপনাকে সিস্টেমের ফাইল মুছতে দেয় না — এটি একটি সুরক্ষা-বেড়া। sudo সেই বেড়া সরিয়ে দেয়। তাই: (১) শুধু তখনই sudo বা Administrator ব্যবহার করুন, যখন কাজটির সত্যিই দরকার (সফটওয়্যার ইনস্টল, সিস্টেম আপডেট); (২) কমান্ড “Permission denied” বললে অভ্যাসবশত sudo যোগ করবেন না — আগে বুঝুন কেন অনুমতি নেই; (৩) অ্যাডমিন জানালায় কাজ শেষ হলেই সেটি বন্ধ করুন।

Environment variable আর PATH — “command not found” কেন আসে

অপারেটিং সিস্টেম প্রতিটি প্রোগ্রামের জন্য কিছু নাম-মানের জোড়া রাখে — আপনার নাম, হোম ফোল্ডার, কোন ভাষা ইত্যাদি। এদের বলে environment variable. দেখতে: bash-এ echo $HOME, PowerShell-এ $env:USERPROFILE, cmd-এ echo %USERPROFILE%.

এদের মধ্যে সবচেয়ে গুরুত্বপূর্ণ হলো PATH — কয়েকটি ফোল্ডারের তালিকা। আপনি python লিখলে shell এই ফোল্ডারগুলোতে একে একে খোঁজে। এখানেই তিন রকম পরিচিত বার্তার উৎস:

bash:        pyhton: command not found
cmd:         'pyhton' is not recognized as an internal or external command,
             operable program or batch file.
PowerShell:  pyhton : The term 'pyhton' is not recognized as the name of a cmdlet,
             function, script file, or operable program. ...

এর তিনটি সম্ভাব্য কারণ, এই ক্রমে যাচাই করুন: (১) বানান ভুল — এখানে pyhton; (২) প্রোগ্রামটি আসলে ইনস্টলই নেই; (৩) ইনস্টল আছে, কিন্তু তার ফোল্ডার PATH-এ নেই — তখন পুরো ঠিকানা দিয়ে চালালে চলে। কোন ফোল্ডারের প্রোগ্রাম চলছে জানতে: bash-এ which python, PowerShell-এ Get-Command python. PATH নিজে দেখতে: echo $PATH বা $env:Path. নতুন সফটওয়্যার ইনস্টলের পর terminal বন্ধ করে আবার খুললে অনেক সময় সমস্যা মিটে যায়, কারণ খোলা terminal পুরোনো PATH মনে রেখে বসে থাকে।

Package manager — কমান্ড দিয়ে সফটওয়্যার ইনস্টল

ওয়েবসাইট খুঁজে, ইনস্টলার নামিয়ে, Next-Next-Finish চাপার বদলে এক লাইনে ইনস্টল — মোবাইলের Play Store-এর মতো, কিন্তু কিবোর্ডে। সফটওয়্যার আসে একটি নির্দিষ্ট ভান্ডার থেকে, তাই নকল ওয়েবসাইট থেকে ম্যালওয়্যার নামানোর ঝুঁকিও কমে।

winget search vlc                 # খোঁজা
winget install VideoLAN.VLC       # ইনস্টল
winget upgrade --all              # সব ইনস্টল করা সফটওয়্যার আপডেট

Windows 11 আর হালনাগাদ Windows 10-এ winget আগে থেকেই থাকে (App Installer-এর অংশ)।

sudo apt update                   # ভান্ডারের তালিকা হালনাগাদ
sudo apt install vlc              # ইনস্টল
sudo apt upgrade                  # সব প্যাকেট আপডেট

সিস্টেমে সফটওয়্যার বসানো হয় বলে এখানে sudo লাগে। macOS-এ এমন কাজের জন্য জনপ্রিয় হলো Homebrew (brew install).

৮ · স্ক্রিপ্ট, WSL, SSH আর এক নজরে cheat sheet

প্রথম স্ক্রিপ্ট — Downloads-এর ছবি মাস অনুযায়ী Pictures-এ

শুরুর সেই তানভীরের সমস্যাটি মনে আছে? কয়েকটি কমান্ড একটি ফাইলে লিখে রাখলেই হয় স্ক্রিপ্ট. নিচের স্ক্রিপ্ট Downloads-এর প্রতিটি .jpg ফাইল নেয়, ফাইলটি শেষ কবে বদলানো হয়েছিল দেখে 2026-09 ধাঁচের একটি ফোল্ডার বানায় (না থাকলে), আর ছবিটিকে সেখানে সরায়।

# organize-photos.ps1 — Downloads-এর .jpg মাস অনুযায়ী Pictures-এ
$src = "$HOME\Downloads"
$dst = "$HOME\Pictures"
Get-ChildItem -Path $src -Filter *.jpg | ForEach-Object {
    $folder = Join-Path $dst $_.LastWriteTime.ToString("yyyy-MM")
    New-Item -ItemType Directory -Path $folder -Force | Out-Null
    Move-Item -Path $_.FullName -Destination $folder -WhatIf
}

প্রত্যাশিত আউটপুট (প্রথমবার, -WhatIf থাকা অবস্থায়) — প্রতিটি ছবির জন্য এমন একটি লাইন; কোনো ছবি আসলে সরে না:

What if: Performing the operation "Move File" on target "Item: C:\Users\Rina\Downloads\IMG_0412.jpg Destination: C:\Users\Rina\Pictures\2026-09\IMG_0412.jpg".
#!/bin/bash
# organize-photos.sh — Downloads-এর .jpg মাস অনুযায়ী Pictures-এ
for f in ~/Downloads/*.jpg; do
  [ -e "$f" ] || continue                 # কোনো .jpg না থাকলে কিছু কোরো না
  month=$(date -r "$f" +%Y-%m)            # ফাইল বদলানোর মাস, যেমন 2026-09
  mkdir -p ~/Pictures/"$month"            # ফোল্ডার না থাকলে বানাও
  mv -n -v "$f" ~/Pictures/"$month"/      # -n: একই নামের ফাইল থাকলে ওপরে লিখো না
done

প্রত্যাশিত আউটপুট (-v = verbose, প্রতিটি সরানো দেখায়):

renamed '/home/rina/Downloads/IMG_0412.jpg' -> '/home/rina/Pictures/2026-09/IMG_0412.jpg'

দুটি স্ক্রিপ্টের চিন্তা একই: প্রতিটি ফাইলের জন্য (loop) → তারিখ থেকে মাসের নাম বানাও → ফোল্ডার নিশ্চিত করো → ফাইল সরাও। PowerShell সংস্করণে -WhatIf রাখা হয়েছে ইচ্ছা করে — প্রথমবার চালালে শুধু দেখায় কোন ফাইল কোথায় যেত (মাসের ফোল্ডারগুলো অবশ্য বানিয়ে ফেলে)। সব ঠিক দেখলে তবেই -WhatIf মুছে আবার চালান। bash সংস্করণে mv -n একই নামের ফাইল থাকলে ওপরে লেখে না। চালানোর নিয়ম: bash-এ একবার chmod +x organize-photos.sh, তারপর ./organize-photos.sh; PowerShell-এ .\organize-photos.ps1. Windows ডিফল্টভাবে অচেনা .ps1 স্ক্রিপ্ট চালাতে দেয় না — এটি নিরাপত্তার জন্য; নিজের স্ক্রিপ্টের জন্য অনুমতি বদলাতে হলে Microsoft-এর অফিশিয়াল নির্দেশনা পড়ে বুঝে নিন, অচেনা কারও কথায় নয়।

WSL — Windows-এর ভেতরে Linux

Windows ব্যবহার করেন, কিন্তু bash শিখতে চান? WSL (Windows Subsystem for Linux) দিয়ে Windows-এর ভেতরেই আসল Ubuntu চালানো যায় — আলাদা কম্পিউটার বা dual-boot ছাড়াই। Administrator হিসেবে খোলা Terminal-এ wsl --install লিখে restart দিলে সাধারণত Ubuntu বসে যায়। তারপর Windows Terminal-এর তালিকায় PowerShell-এর পাশেই Ubuntu দেখাবে। Windows-এর C: ড্রাইভ সেখানে দেখা যায় /mnt/c হিসেবে — তাই Linux থেকে মুছলে Windows-এর ফাইলও সত্যিই মুছে যায়, সাবধান।

SSH — দূরের সার্ভারের কমান্ড লাইন

একটি ওয়েবসাইটের সার্ভার হয়তো সিঙ্গাপুরের কোনো ডেটা সেন্টারে। সেখানে মনিটর নেই, আপনি যাবেনও না। SSH (Secure Shell) দিয়ে নিজের terminal থেকে ssh rina@203.0.113.10 লিখলে সেই সার্ভারের shell-এ ঢুকে পড়েন — এরপর যা লিখবেন, চলবে ওখানে। পুরো সংযোগ এনক্রিপ্ট করা থাকে, তাই পাসওয়ার্ড বা কমান্ড পথে কেউ পড়তে পারে না। Windows 10/11-এ ssh কমান্ড আগে থেকেই থাকে। সতর্কতা: SSH-এ ঢোকার পর prompt-এর কম্পিউটারের নামটি সবসময় দেখে নিন — নিজের ল্যাপটপ ভেবে সার্ভারে rm চালানো পেশাদারদেরও পরিচিত দুর্ঘটনা। সার্ভার আর ক্লাউডে এর ব্যবহার দেখতে পারেন Cloud ও DevOps কোর্সে, আর নিরাপত্তার দিকটি সাইবার সিকিউরিটি কোর্সে.

এক নজরে cheat sheet — কাজ → PowerShell → bash

কাজPowerShellbash
আমি কোথায়Get-Location (pwd)pwd
তালিকা (লুকানোসহ)Get-ChildItem -Forcels -la
ফোল্ডার বদল / এক ধাপ ওপরেcd docs / cd ..cd docs / cd ..
নতুন ফোল্ডারmkdir notesmkdir notes
খালি ফাইলNew-Item a.txttouch a.txt
কপি (ফোল্ডারসহ)Copy-Item src dst -Recursecp -r src dst
সরানো / নাম বদলMove-Item a.txt b.txtmv a.txt b.txt
মোছা (স্থায়ী!)Remove-Item a.txtrm a.txt
ফাইল পড়াGet-Content a.txtcat a.txt
শেষ ২০ লাইনGet-Content log.txt -Tail 20tail -n 20 log.txt
লেখার ভেতর খোঁজাSelect-String "error" log.txtgrep "error" log.txt
নাম দিয়ে ফাইল খোঁজাGet-ChildItem -Recurse -Filter *.pdffind . -name "*.pdf"
সাহায্যGet-Help Copy-Itemman cp, cp --help
নেটওয়ার্ক তথ্য / pingipconfig / ping google.comip a / ping -c 4 google.com
চলমান প্রসেস / বন্ধGet-Process / Stop-Process -Id 4123ps aux / kill 4123
Environment variable$env:Pathecho $PATH
প্রোগ্রাম কোথায়Get-Command pythonwhich python
সফটওয়্যার ইনস্টলwinget install VideoLAN.VLCsudo apt install vlc
পর্দা পরিষ্কারcls (Clear-Host)clear (বা Ctrl+L)

পরীক্ষা ও ইন্টারভিউতে — বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় এ ধরনের প্রশ্ন প্রায়ই আসে:

  • CLI আর GUI-এর পার্থক্য কী? CLI-তে লেখা কমান্ডে কাজ (দ্রুত, স্বয়ংক্রিয় করা যায়, শিখতে কঠিন); GUI-তে আইকন-মেনু-মাউসে (সহজ, কিন্তু পুনরাবৃত্তিমূলক কাজে ধীর)। MS-DOS ছিল CLI-ভিত্তিক OS.
  • Shell কী? ব্যবহারকারীর লেখা কমান্ড পড়ে OS-কে দিয়ে কাজ করানোর প্রোগ্রাম — kernel আর মানুষের মাঝের স্তর; উদাহরণ: bash, PowerShell, cmd.
  • ipconfig আর ping কী করে? ipconfig কম্পিউটারের IP ঠিকানা ও নেটওয়ার্ক-তথ্য দেখায়; ping অন্য কম্পিউটারে পৌঁছানো যায় কি না আর কত সময় লাগে, যাচাই করে।
  • Windows-এ ফাইলের তালিকা দেখার কমান্ড কী, Linux-এ কী? cmd-এ dir, PowerShell-এ Get-ChildItem (বা dir/ls); Linux-এ ls.
  • Absolute আর relative path-এর পার্থক্য? Absolute শুরু হয় গোড়া থেকে (C:\ বা /) আর সবসময় একই জায়গা বোঝায়; relative শুরু হয় বর্তমান ফোল্ডার থেকে।

আরও গভীরে: Shell কীভাবে নতুন প্রোগ্রাম চালায়? Linux-এ সে নিজের একটি কপি বানায় (fork), তারপর সেই কপিকে বলে নতুন প্রোগ্রামে বদলে যেতে (exec), আর নিজে অপেক্ষা করে (wait) — এই তিনটি system call-ই প্রতিটি কমান্ডের ভিত্তি; Windows-এ এর কাজ করে CreateProcess. Pipe আসলে kernel-এর ভেতরের একটি ছোট বাফার। আগ্রহ থাকলে পড়ুন Operating Systems কোর্সের System call আর প্রসেস তৈরি ও সমাপ্তি অধ্যায়।

৯ · AI-এর যুগে — টার্মিনাল কমান্ড পেস্ট করার আগে

“আমার ল্যাপটপ স্লো, কী করব?”, “পুরোনো ফাইলগুলো একবারে মুছতে চাই” — এমন প্রশ্নে AI চ্যাটবট প্রায়ই সরাসরি একটি কমান্ড দিয়ে দেয়: “এটি PowerShell-এ পেস্ট করুন”। অনেক সময় কমান্ডটি ঠিকই থাকে, আর সময়ও বাঁচে। কিন্তু কমান্ড লাইনে Recycle Bin নেই, “আপনি কি নিশ্চিত?” নেই — একটি ভুল লাইনের দাম অনেক। তাই নিয়ম একটাই: যে কমান্ডের প্রতিটি অংশ বোঝেন না, সেটি চালাবেন না।

এমন কিছু দেখলে থামুনকেন বিপজ্জনকআপনি যা করবেন
sudo …, Administrator জানালাOS-এর সব সুরক্ষা-বেড়া সরিয়ে কমান্ড চলেজিজ্ঞেস করুন: এই কাজে কেন অ্যাডমিন লাগবে?
rm -rf, Remove-Item -Recurse -Force, del /s /qপ্রশ্ন ছাড়া, ফেরত ছাড়া পুরো ফোল্ডার মোছেআগে একই path দিয়ে ls চালান; PowerShell-এ -WhatIf যোগ করুন
curl … | sh, iwr … | iexইন্টারনেট থেকে অচেনা স্ক্রিপ্ট নামিয়ে না দেখেই চালায়শুধু অফিশিয়াল ডকুমেন্টেশনে থাকলে; তা-ও আগে স্ক্রিপ্টটি খুলে পড়ুন
Set-ExecutionPolicy Unrestricted বা Bypassস্থায়ীভাবে Windows-এর স্ক্রিপ্ট-সুরক্ষা ঢিলা করে“কেন” না বুঝে বদলাবেন না; বদলালে কোন scope-এ, জেনে নিন
Antivirus বা firewall বন্ধ করার কমান্ডসমস্যা সমাধানের নামে নিরাপত্তা খুলে দেয়প্রায় কখনোই সঠিক সমাধান নয়

একটি প্রচলিত প্রতারণা: কোনো ওয়েবসাইটে নকল “আমি রোবট নই” যাচাই বা “ভুল ঠিক করুন” বোতাম আসে, আর নির্দেশ থাকে — “Win+R চাপুন, Ctrl+V দিন, Enter চাপুন”। পেজটি গোপনে আপনার clipboard-এ একটি PowerShell কমান্ড রেখে দিয়েছে, যা ম্যালওয়্যার নামায়। কোনো আসল ওয়েবসাইট কখনো যাচাইয়ের জন্য কমান্ড চালাতে বলে না। এমন কিছু দেখলে পেজ বন্ধ করুন। নিরাপত্তা নিয়ে আরও পর্ব ৪৩-এ।

AI-কে কমান্ড চাওয়ার সঠিক উপায় — আগে ব্যাখ্যা, তারপর পরীক্ষা, শেষে আসল কাজ:

আমি Windows 11-এ PowerShell ব্যবহার করি (Linux হলে লিখব: Ubuntu, bash). আমার Downloads ফোল্ডারে ৯০ দিনের পুরোনো .zip ফাইলগুলো মুছতে চাই। ১. কমান্ডটি দাও, তারপর প্রতিটি অংশ (কমান্ড, প্রতিটি option, argument, pipe) আলাদা করে সহজ বাংলায় ব্যাখ্যা করো। ২. আগে এমন একটি সংস্করণ দাও যা কিছু না মুছে শুধু তালিকা দেখায় (যেমন -WhatIf বা শুধু Get-ChildItem). ৩. এই কমান্ডে কি Administrator বা sudo লাগবে? না লাগলে স্পষ্ট বলো। ৪. সবচেয়ে খারাপ কী ভুল হতে পারে, আর তা এড়াতে কী করব? ৫. কোন অফিশিয়াল ডকুমেন্টেশন পাতায় এই কমান্ডগুলো মিলিয়ে নিতে পারি, তার নাম দাও।

AI-এর দেওয়া কমান্ড চালানোর আগে — চেকলিস্ট

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন। কালো জানালার পেছনে অর্ধশতাব্দীর ইতিহাস লুকিয়ে আছে।

প্র ০১কমান্ড লাইনের জানালাকে “terminal” বলে কেন? Linux-এ “tty” শব্দটি কোথা থেকে এলো?

১৯৬০-এর দশকে একটি কম্পিউটার ছিল ঘরভর্তি যন্ত্র, আর দাম এত বেশি যে একটি প্রতিষ্ঠানে হয়তো একটিই থাকত। অনেক মানুষ একসাথে ব্যবহার করতেন time-sharing পদ্ধতিতে — কম্পিউটার খুব দ্রুত একজনের পর আরেকজনের কাজ করত। প্রত্যেকের টেবিলে থাকত একটি যন্ত্র, যা তার দিয়ে মূল কম্পিউটারের সাথে যুক্ত — এই তারের শেষ প্রান্তের যন্ত্রটিই terminal (প্রান্ত)। Terminal নিজে কোনো হিসাব করত না; শুধু আপনার লেখা পাঠাত আর উত্তর দেখাত।

প্রথম দিকের terminal-এ পর্দাই ছিল না। সবচেয়ে জনপ্রিয় ছিল Teletype কোম্পানির টেলিপ্রিন্টার — মূলত টেলিগ্রাম পাঠানোর জন্য বানানো, টাইপরাইটারের মতো কিবোর্ড আর কাগজের রোল। বিশেষ করে Teletype Model 33 তুলনামূলক সস্তা ছিল বলে বহু কম্পিউটারের সাথে ব্যবহৃত হতো। আপনি টাইপ করতেন, অক্ষরগুলো কাগজে ছাপা হতো; কম্পিউটারের উত্তরও খটখট শব্দে কাগজে ছাপা হতো। Unix তৈরিও শুরু হয় এমন যন্ত্রের সামনে বসে। “teletypewriter”-এর সংক্ষেপ TTY — আর আজও Linux-এ terminal-কে বোঝাতে /dev/tty নামের ফাইল থাকে, tty কমান্ড বলে দেয় আপনি কোন terminal-এ আছেন।

এই কাগজের যুগের ছাপ আজও কমান্ড লাইনের সবখানে। Unix কমান্ডের নাম এত ছোট (ls, cp, mv, rm) কারণ ধীর আর শব্দময় যন্ত্রে প্রতিটি অক্ষর টাইপ করা ছিল পরিশ্রমের। সফল কমান্ড চুপ থাকে, কারণ অপ্রয়োজনীয় লেখা মানে অপচয় হওয়া কাগজ আর সময়। লাইনের শেষে “carriage return” আর “line feed” — দুটি আলাদা চিহ্ন — এসেছে টাইপরাইটারের মাথা বাঁয়ে ফেরানো আর কাগজ এক লাইন ওপরে তোলার দুটি যান্ত্রিক কাজ থেকে; Windows আর Linux-এর লেখার ফাইলে লাইনের শেষ আজও এ কারণে আলাদা।

সত্তরের দশকের শেষে আসে পর্দাওয়ালা “video terminal”, যেমন DEC-এর VT100 (১৯৭৮), যা কার্সর সরানো আর রঙের জন্য বিশেষ কোড বুঝত। আজকের Windows Terminal বা Ubuntu-র Terminal আসলে সফটওয়্যারে বানানো সেই যন্ত্রের নকল — তাই এদের বলে terminal emulator, আর এগুলো এখনো VT100-ধাঁচের কোড বোঝে।

মূল উপলব্ধি: প্রযুক্তির নাম প্রায়ই তার অতীতের চিহ্ন বয়ে বেড়ায়। “Terminal” এখন একটি অ্যাপ, কিন্তু তার আচরণ — ছোট কমান্ড, নীরব সাফল্য, লাইনভিত্তিক লেখা — বোঝা যায় কাগজ-ছাপানো টেলিপ্রিন্টারের সীমাবদ্ধতা থেকে।

প্র ০২Thompson shell থেকে Bourne shell আর bash — Unix shell কীভাবে বড় হলো? আর pipe কেন এত বড় আবিষ্কার?

১৯৬৯ সালে Bell Labs-এ Ken Thompson আর Dennis Ritchie একটি ছোট, অব্যবহৃত PDP-7 কম্পিউটারে Unix লেখা শুরু করেন। ১৯৭১ সালে Unix-এর প্রথম সংস্করণের সাথে আসে Thompson-এর লেখা প্রথম shell — Thompson shell. এটি কমান্ড পড়ে চালাত, > দিয়ে আউটপুট ফাইলে পাঠাতে পারত। একটি মৌলিক সিদ্ধান্ত ছিল: shell kernel-এর অংশ নয়, বরং একটি সাধারণ প্রোগ্রাম — চাইলে যে কেউ নিজের shell লিখতে পারে। এই সিদ্ধান্তের কারণেই আজ এত রকম shell.

১৯৭৩ সালে আসে pipe. Doug McIlroy বহু বছর ধরে বলছিলেন, প্রোগ্রামগুলোকে বাগানের পাইপের মতো জোড়া লাগানো যাওয়া উচিত। Thompson শেষে Unix-এ pipe যোগ করেন — কথিত আছে, এক রাতেই — আর পরের দিন সকালে Bell Labs-এর গবেষকেরা পুরোনো প্রোগ্রামগুলোকে এমনভাবে বদলাতে শুরু করেন যাতে সেগুলো ইনপুট পড়ে আর আউটপুট লেখে, বাড়তি কথা না বলে। এর ফল সুদূরপ্রসারী: একটি বিশাল “সব-জানা” প্রোগ্রাম বানানোর বদলে বহু ছোট টুল, যা নানাভাবে জোড়া লাগিয়ে এমন কাজও করা যায় যা তাদের নির্মাতারা কল্পনাও করেননি। সফটওয়্যার নকশায় একে বলে composition — আধুনিক microservice বা ডেটা-পাইপলাইনের চিন্তাতেও একই ধারণা।

১৯৭৯ সালে Unix Version 7-এর সাথে আসে Stephen Bourne-এর Bourne shell (sh). এটি shell-কে একটি পূর্ণ প্রোগ্রামিং ভাষা বানায় — ভ্যারিয়েবল, if, for, while — ফলে স্ক্রিপ্ট লেখা সহজ হয়। আজও বহু স্ক্রিপ্টের প্রথম লাইন #!/bin/sh. প্রায় একই সময়ে Berkeley-তে Bill Joy বানান C shell, যা কমান্ড-ইতিহাসের মতো সুবিধা জনপ্রিয় করে।

কিন্তু Bourne shell ছিল AT&T-এর মালিকানাধীন। Richard Stallman-এর GNU প্রজেক্ট একটি সম্পূর্ণ মুক্ত Unix-সদৃশ সিস্টেম চাইছিল, তাই ১৯৮৯ সালে Brian Fox প্রকাশ করেন bash — নামটি একটি শব্দখেলা: “Bourne-Again SHell” (আবার জন্ম নেওয়া Bourne shell). ১৯৯১ সালে Linux আসার পর GNU-র টুলের সাথে bash হয়ে যায় প্রায় সব Linux-এর ডিফল্ট shell. Apple লাইসেন্সের কারণে ২০১৯ সালে macOS-এর ডিফল্ট বদলে zsh করে, কিন্তু bash-এর স্ক্রিপ্ট আজও সার্ভার জগতের প্রধান ভাষাগুলোর একটি।

মূল উপলব্ধি: shell-কে সাধারণ প্রোগ্রাম রাখা আর pipe দিয়ে ছোট টুল জোড়ার সুযোগ — এই দুটি সরল সিদ্ধান্ত পঞ্চাশ বছরেরও বেশি টিকে আছে। ভালো নকশা প্রায়ই বড় ফিচার নয়, বরং এমন সাধারণ নিয়ম যা অন্যদের নতুন কিছু বানাতে দেয়।

প্র ০৩cmd থাকা সত্ত্বেও Microsoft কেন PowerShell বানাল? আর ২০১৬ সালে কেন এটিকে ওপেন সোর্স করল?

Windows-এর কমান্ড লাইনের শিকড় ১৯৮১ সালের MS-DOS-এর COMMAND.COM-এ। পরে Windows NT-তে এলো cmd.exe — কিন্তু চিন্তা প্রায় একই থেকে গেল: সরল কমান্ড আর .bat ব্যাচ ফাইল। নব্বইয়ের দশক জুড়ে Windows-এর শক্তি ছিল GUI; সার্ভার চালানোর কাজও মূলত মাউসে। কিন্তু যখন একটি প্রতিষ্ঠানে শত শত Windows সার্ভার, তখন প্রতিটিতে ক্লিক করে সেটিংস বদলানো অসম্ভব হয়ে দাঁড়াল। Unix জগতে যে স্বয়ংক্রিয়তা সহজ ছিল, Windows-এ তা ছিল কষ্টকর।

Microsoft-এর প্রকৌশলী Jeffrey Snover ২০০২ সালে একটি নকশাপত্র লেখেন — “Monad Manifesto”. তাঁর পর্যবেক্ষণ ছিল, Unix-এর pipe দিয়ে যায় শুধু লেখা, তাই প্রতিটি টুলকে আগের টুলের আউটপুট কেটে-ছেঁটে অর্থ বের করতে হয় — কলাম গোনা, স্পেস ধরে ভাগ করা। কোনো টুলের আউটপুটের ধরন একটু বদলালে পরের সব স্ক্রিপ্ট ভেঙে পড়ে। আর Windows-এর ভেতরের সবকিছু — ফাইল, প্রসেস, রেজিস্ট্রি, সেবা — আগে থেকেই .NET-এর object হিসেবে বর্ণনা করা যায়। তাহলে pipe দিয়ে সরাসরি object পাঠালে কেমন হয়? প্রতিটি ফাইল যাবে নাম, আকার, তারিখের আলাদা ঘরসহ; পরের কমান্ড বলবে “Length 1MB-এর বেশি এমনগুলো দাও” — কোনো লেখা কাটাছেঁড়া ছাড়াই।

এই চিন্তা থেকে নভেম্বর ২০০৬-এ প্রকাশিত হয় Windows PowerShell 1.0. কমান্ডের নাম সুশৃঙ্খল “ক্রিয়া-বিশেষ্য” ধাঁচে — Get-Process, Stop-Service, New-Item — যাতে একটি জানলে বাকিগুলো অনুমান করা যায়। পরের বছরগুলোতে Microsoft-এর সার্ভার আর ক্লাউড পণ্যের পরিচালনা ক্রমেই PowerShell-কেন্দ্রিক হয়ে ওঠে।

২০১৪ সালের পর Microsoft-এর কৌশল বদলায় — ক্লাউড (Azure)-এ বিপুল সংখ্যক Linux সার্ভার চলে, আর ডেভেলপাররা Mac আর Linux-এও কাজ করেন। আগস্ট ২০১৬-এ Microsoft PowerShell-কে ওপেন সোর্স করে আর Linux ও macOS-এ চালানোর মতো বানায়। আজকের PowerShell 7 এই ক্রস-প্ল্যাটফর্ম ধারার; Windows-এ পুরোনো Windows PowerShell 5.1-ও এখনো পাশাপাশি থাকে। একই ধারায় এসেছে WSL (২০১৬), নতুন Windows Terminal (২০১৯-২০২০) আর winget.

মূল উপলব্ধি: PowerShell দেখায় যে একটি পুরোনো ধারণা (pipe) নতুন প্রেক্ষাপটে (object) আরও শক্তিশালী হতে পারে। আর ২০১৬-এর সিদ্ধান্ত দেখায়, আজকের বাজারে “সবখানে চলা” প্রায়ই “শুধু নিজের প্ল্যাটফর্মে আটকে রাখা”-র চেয়ে বেশি মূল্যবান।

প্র ০৪এত সুন্দর GUI থাকতে সার্ভার আর ক্লাউড আজও কমান্ড লাইনে চলে কেন?

একটি ই-কমার্স প্রতিষ্ঠানের কথা ভাবুন, যার ওয়েবসাইট চলে ৫০টি সার্ভারে। ঈদের আগে বিক্রি বাড়বে, তাই আরও ৫০টি সার্ভার চালু করে প্রতিটিতে একই সফটওয়্যার, একই সেটিংস বসাতে হবে। GUI-তে মানে ৫০ বার একই ক্লিকের ক্রম — আর কোথাও একটি ভুল টিক পড়লে সেই সার্ভারটি অন্যদের থেকে আলাদা আচরণ করবে, যা খুঁজে বের করা দুঃস্বপ্ন। কমান্ড লাইনে কাজটি একটি স্ক্রিপ্ট: একবার লেখা, ৫০ বার হুবহু চলে।

কারণগুলো তাই কয়েকটি স্তরে। প্রথমত, সম্পদ: GUI চালাতে RAM, CPU আর ডিস্ক লাগে। সার্ভারে কেউ পর্দার সামনে বসেন না, তাই বেশিরভাগ Linux সার্ভারে GUI ইনস্টলই করা হয় না — সেই সম্পদ আসল কাজে যায়, আর কম সফটওয়্যার মানে নিরাপত্তার ফাঁকও কম। দ্বিতীয়ত, দূরত্ব: সার্ভার থাকে অন্য শহরে বা দেশে; SSH দিয়ে লেখা পাঠানো ধীর ইন্টারনেটেও চলে, পুরো পর্দার ছবি পাঠানোর চেয়ে অনেক হালকা।

তৃতীয়ত, স্বয়ংক্রিয়তা আর পুনরাবৃত্তি: DevOps-এর মূল ধারণা হলো “Infrastructure as Code” — সার্ভার কেমন হবে, তা লেখা থাকে কোডে; সেই কোড Git-এ রাখা হয়, অন্যরা পর্যালোচনা করেন, ভুল হলে আগের সংস্করণে ফেরা যায়। কেউ কোন বোতামে ক্লিক করেছিলেন, তার ইতিহাস রাখা যায় না; কিন্তু কোন কমান্ড চলেছিল, তা রাখা যায়। চতুর্থত, সংযোগ: ক্লাউড প্রতিষ্ঠানগুলোর ওয়েব কনসোল আছে ঠিকই, কিন্তু সাথে প্রতিটির নিজস্ব কমান্ড-লাইন টুলও আছে, আর কনসোলের প্রায় প্রতিটি বোতাম ভেতরে ভেতরে একটি API ডাকে — যা স্ক্রিপ্টও ডাকতে পারে।

তবে এর মানে GUI অপ্রয়োজনীয় নয়। নতুন কিছু খুঁজে দেখা, গ্রাফ আর ড্যাশবোর্ড দেখা, একবারের কাজ — এসবে GUI ভালো। বাস্তবে পেশাদারেরা দুটোই ব্যবহার করেন: GUI-তে বোঝেন, CLI-তে বারবার করেন। ক্লাউড নিয়ে বিস্তারিত পর্ব ৩৫-এ।

মূল উপলব্ধি: যে কাজ একবার করবেন, GUI যথেষ্ট; যে কাজ একশোবার বা একশোটি কম্পিউটারে করবেন, তা লেখা কমান্ডে হওয়া উচিত। কমান্ড লাইন শেখা মানে পুরোনো প্রযুক্তি শেখা নয় — আধুনিক ক্লাউড আর DevOps-এর দরজা খোলা।

প্র ০৫“rm -rf /” নিয়ে এত গল্প কেন? আধুনিক টুল এমন দুর্ঘটনা ঠেকাতে কী কী বেড়া দিয়েছে?

rm -rf / মানে: “গোড়া (/) থেকে শুরু করে সবকিছু (-r), কোনো প্রশ্ন ছাড়া (-f) মোছো।” root ক্ষমতায় চললে এটি পুরো সিস্টেম মুছে ফেলতে পারে। এই লাইনটি কমান্ড-লাইন জগতে সতর্কবার্তার প্রতীক হয়ে গেছে, আর ইন্টারনেটে একে “মজা” বলে নতুনদের চালাতে বলার ঘটনাও ঘটেছে — তাই কেউ এমন কিছু চালাতে বললে সেটি বন্ধুর পরামর্শ নয়, ফাঁদ।

আসল দুর্ঘটনাগুলো সাধারণত এত স্পষ্ট নয়, বরং ছোট ভুল থেকে আসে। একটি পরিচিত ধরন: স্ক্রিপ্টে লেখা rm -rf "$FOLDER/"*, কিন্তু কোনো কারণে FOLDER ভ্যারিয়েবল খালি — তখন কমান্ডটি হয়ে যায় rm -rf /*. ২০১৫ সালে Linux-এর জন্য Steam গেম-প্ল্যাটফর্মের একটি স্ক্রিপ্টে ঠিক এমন ধরনের ত্রুটির কারণে কিছু ব্যবহারকারীর নিজস্ব ফাইল মুছে যাওয়ার খবর আসে। আরেক ধরন হলো ভুল জায়গায় একটি স্পেস — rm -rf /usr /lib/… যেখানে /usr/lib/… লেখার কথা ছিল। এমন ঘটনাও বলা হয় যে অ্যানিমেশন স্টুডিওর একটি ছবির প্রায় পুরো কাজ ভুল কমান্ডে মুছে গিয়েছিল আর এক কর্মীর বাড়ির কম্পিউটারের কপি থেকে উদ্ধার হয়েছিল।

এর জবাবে টুলগুলোতে কয়েক স্তরের বেড়া যোগ হয়েছে। GNU coreutils-এর rm এখন ডিফল্টভাবে --preserve-root মেনে চলে — সরাসরি / মুছতে বললে অস্বীকার করে। rm -I option দিলে একসাথে অনেক ফাইল বা পুরো ফোল্ডার মোছার আগে একবার জিজ্ঞেস করে; কিছু ডিস্ট্রিবিউশন root ব্যবহারকারীর জন্য rm-কে আগে থেকেই rm -i করে রাখে। bash-এ set -u লিখলে কখনো মান দেওয়া হয়নি এমন (unset) ভ্যারিয়েবল ব্যবহারে স্ক্রিপ্ট থেমে যায়; আর ${FOLDER:?} লিখলে ভ্যারিয়েবলটি না থাকলে বা খালি হলে ভুল দেখিয়ে থামে। ShellCheck-এর মতো টুল স্ক্রিপ্ট চালানোর আগেই এমন ঝুঁকি দেখিয়ে দেয়। PowerShell-এর -WhatIf আর -Confirm একই দর্শনের — আগে দেখো, পরে করো। ডেস্কটপে trash-cli-এর মতো টুল ফাইলকে মুছে না ফেলে Trash-এ পাঠায়।

কিন্তু সবচেয়ে বড় বেড়া প্রযুক্তিগত নয়, অভ্যাসগত: Standard অ্যাকাউন্টে কাজ, অকারণে sudo না দেওয়া, মোছার আগে ls দিয়ে দেখা, আর সর্বোপরি নিয়মিত, পরীক্ষিত ব্যাকআপ।

মূল উপলব্ধি: শক্তিশালী টুল ভুলও শক্তিশালীভাবে করে। ভালো প্রকৌশল মানে মানুষ ভুল করবে ধরে নিয়েই বেড়া বানানো — আর ভালো ব্যবহারকারী মানে সেই বেড়াগুলো চেনা ও ইচ্ছা করে না সরানো।

অনুশীলন

নিজের কম্পিউটারে একটি আলাদা practice ফোল্ডারে করুন — জরুরি ফাইলের ধারেকাছে নয়।

  1. প্রথম পরিচয়: Terminal খুলে prompt-টি খাতায় হুবহু লিখুন। তারপর pwd (বা Get-Location), ls আর whoami চালান। আপনি কোন shell-এ, কোন ফোল্ডারে, কোন ব্যবহারকারী হিসেবে আছেন?

    Windows-এ সাধারণত দেখবেন PS C:\Users\আপনার-নাম> — শুরুতে PS মানে PowerShell; Get-Location একই ঠিকানা দেখাবে, আর whoami দেখাবে কম্পিউটারের-নাম\ব্যবহারকারী. Ubuntu-তে prompt হবে নাম@কম্পিউটার:~$, pwd দেবে /home/নাম. ls-এর তালিকা File Explorer-এ আপনার ব্যবহারকারী-ফোল্ডারের সাথে মিলিয়ে দেখুন — একই জিনিস, দুই চেহারায়। শেষ চিহ্ন $ না হয়ে # হলে, বা Windows Terminal-এর শিরোনামে “Administrator” থাকলে, জানালাটি বন্ধ করে সাধারণভাবে আবার খুলুন।

  2. Path লেখা: ফোল্ডার-ট্রি: /home/rina-এর ভেতরে docs (তার ভেতরে cv.pdf) আর photos. আপনি আছেন /home/rina/docs-এ। (ক) cv.pdf-এর absolute path কী? (খ) এখান থেকে photos-এ যাওয়ার relative path কী? (গ) cd ../.. চালালে কোথায় যাবেন?

    (ক) /home/rina/docs/cv.pdf — গোড়া / থেকে পুরো ঠিকানা। (খ) ../photos — এক ধাপ ওপরে (/home/rina), তারপর photos-এ। তাই cd ../photos. একই কাজ absolute path দিয়ে: cd /home/rina/photos, অথবা cd ~/photos. (গ) দুই ধাপ ওপরে: docs → rina → /home. অর্থাৎ /home. ওপরের সিমুলেটরে কমান্ডের তালিকায় "cd photos", "pwd" যোগ করে আংশিক যাচাইও করতে পারেন।

  3. নিরাপদ খেলার মাঠ: হোম ফোল্ডারে practice বানিয়ে তার ভেতরে তিনটি ফাইল বানান: a.txt, b.txt, c.pdf. এবার শুধু .txt ফাইলগুলো একটি নতুন texts ফোল্ডারে সরান — একটি কমান্ডেই। শেষে PowerShell-এ Remove-Item c.pdf -WhatIf চালিয়ে দেখুন কী বলে, তারপর -WhatIf ছাড়া চালান।

    bash: mkdir ~/practice && cd ~/practice, touch a.txt b.txt c.pdf, mkdir texts, mv *.txt texts/, তারপর ls আর ls texts. PowerShell: mkdir ~\practice; cd ~\practice, New-Item a.txt, b.txt, c.pdf, mkdir texts, Move-Item *.txt texts. -WhatIf দিলে বার্তা আসে What if: Performing the operation "Remove File" on target "…\c.pdf". — কিন্তু ফাইল থেকে যায়; Get-ChildItem দিয়ে নিশ্চিত হোন। -WhatIf ছাড়া চালালে ফাইলটি চলে যায় — Recycle Bin খুলে দেখুন, সেখানে নেই। এই অভ্যাসটিই আসল শিক্ষা: আগে দেখো, পরে মোছো।

  4. Pipe আর redirection: নিজের Downloads ফোল্ডারে কয়টি PDF আছে এক লাইনে গুনুন, আর সব PDF-এর নামের তালিকা pdf-list.txt ফাইলে রাখুন। তারপর একই কমান্ড >> দিয়ে আবার চালিয়ে ফাইলটি খুলুন — কী বদলাল?

    bash: ls ~/Downloads | grep '\.pdf$' | wc -l গোনে; ls ~/Downloads/*.pdf > pdf-list.txt তালিকা রাখে। PowerShell: (Get-ChildItem ~\Downloads -Filter *.pdf).Count, আর Get-ChildItem ~\Downloads -Filter *.pdf -Name > pdf-list.txt. >> দিয়ে আবার চালালে তালিকাটি ফাইলের শেষে দ্বিতীয়বার যোগ হয় — নাম দুবার করে দেখবেন। > দিয়ে চালালে আবার একবারই থাকত, কারণ আগের লেখা মুছে নতুন বসে। হিসাবের খাতা বা লগ ফাইলে তাই >>, আর নতুন রিপোর্টে >.

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমকমান্ড লিখে Enter চাপার পর ঘটনাগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. ⌨️ ব্যবহারকারী কমান্ড লিখে Enter চাপেন
  2. ✂️ Shell লাইনটি ভেঙে কমান্ড, option আর argument আলাদা করে
  3. 🔎 Shell PATH-এর ফোল্ডারগুলোতে প্রোগ্রামটি খোঁজে
  4. ⚙️ অপারেটিং সিস্টেম প্রোগ্রামটিকে নতুন প্রসেস হিসেবে চালায়
  5. 🖥️ প্রোগ্রামের আউটপুট পর্দায় আসে
  6. ↩️ Shell আবার prompt দেখিয়ে অপেক্ষা করে

Linux-এ নিচের কোনটি absolute path?

  • docs/cv.pdf
  • /home/rina/docs/cv.pdf
  • ../docs/cv.pdf
  • ./cv.pdf

Linux-এর bash-এ বর্তমান working directory দেখার কমান্ড কোনটি?

  • ls
  • cd
  • pwd
  • ipconfig

কমান্ড লাইনে cd .. লিখলে কী হয়?

  • এক ধাপ ওপরের ফোল্ডারে চলে যায়
  • সরাসরি হোম ফোল্ডারে চলে যায়
  • ড্রাইভের একেবারে গোড়ায় চলে যায়
  • বর্তমান ফোল্ডারটি মুছে ফেলে

ls > list.txt কমান্ডটি কী করে?

  • list.txt-এর চেয়ে বড় ফাইলগুলো দেখায়
  • তালিকাটি list.txt-এর আগের লেখার শেষে যোগ করে
  • list.txt খুলে পর্দায় দেখায়
  • ফাইল-তালিকা পর্দার বদলে list.txt-এ লেখে, আগের লেখা মুছে

Linux-এ rm -r project চালিয়ে মোছা ফোল্ডার সাধারণত কোথায় পাওয়া যাবে?

  • Trash বা Recycle Bin-এ
  • কোথাও না — এটি স্থায়ীভাবে মুছে যায়
  • একই জায়গায় project.bak নামে
  • একই জায়গায়, শুধু read-only হয়ে

একজন ব্যবহারকারী Python ইনস্টল করেছেন বলে নিশ্চিত, কিন্তু terminal-এ python লিখলে আসছে “command not found”. বানান ঠিক থাকলে সবচেয়ে সম্ভাব্য কারণ কোনটি?

  • ইন্টারনেট সংযোগ নেই
  • কম্পিউটারের RAM কম
  • Python-এর ফোল্ডার PATH environment variable-এ নেই
  • terminal Administrator হিসেবে খোলা হয়নি

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. Terminal জানালা, shell দোভাষী: Windows-এ PowerShell (ও cmd), Linux-এ bash, Mac-এ zsh. কমান্ড = নাম + option + argument.
  2. আপনি সবসময় একটি working directory-তে থাকেন: pwd / ls / cd; .. মানে ওপরের ফোল্ডার, ~ মানে হোম; absolute path গোড়া থেকে, relative path এখান থেকে।
  3. cp, mv, rm, cat, grep, find — আর PowerShell-এ এদের Copy-Item, Move-Item, Remove-Item… rm-এ Recycle Bin নেই; আগে ls বা -WhatIf.
  4. | এক টুলের আউটপুট পরের টুলে দেয়; > ফাইলে লেখে (আগেরটা মুছে), >> যোগ করে। “command not found” মানে বানান, ইনস্টল বা PATH.
  5. sudo/Administrator শুধু দরকারে; winget/apt দিয়ে নিরাপদ ইনস্টল; বারবার করা কাজ স্ক্রিপ্টে। AI বা ওয়েবসাইটের দেওয়া কমান্ড না বুঝে কখনো চালাবেন না।

পরের পর্বে: এই পর্বে ping দিয়ে দূরের কম্পিউটারের সাড়া পেলেন — কিন্তু তারের ভেতর দিয়ে বা বাতাসে ডেটা আসলে কীভাবে যায়? মডিউল ৫ শুরু হচ্ছে ডেটা কমিউনিকেশন দিয়ে — simplex, half-duplex, full-duplex, ব্যান্ডউইথ আর তার থেকে অপটিক্যাল ফাইবার পর্যন্ত নানা মাধ্যম।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান