অধ্যায় 1 · আপনার ডেভেলপার টুলবক্স
টার্মিনাল: ফাইল, পাথ ও কমান্ড
- পৃষ্ঠা 2 / 22
- 16 মিনিট পড়া
এই টিউটোরিয়ালের প্রতিটা টুল — Git, Python, pip আর uv, curl, FastAPI-র সার্ভার, পরে Docker — চালানো হয় টার্মিনাল থেকে। AI মডেল যেসব সার্ভারে চলে, তার প্রায় সবগুলোও তাই: রাত ২টায় ক্লাউডের কোনো GPU-তে ট্রেনিং জব ফেল করলে সেখানে কোনো File Explorer থাকে না, থাকে শুধু একটা প্রম্পট, একটা লগ ফাইল আর এই পাতার কমান্ডগুলো। রোজকার কাজের বেশিরভাগই চলে দশটার মতো কমান্ডে, আর সেগুলো একবার ঠিকমতো শিখে নেওয়া পুরোপুরি সার্থক।
এই পাতায় একটা ছোট অনুশীলনের ফোল্ডার বানাবেন, যাতে থাকবে একটা ডেটাসেট আর একটা সার্ভার লগ। তারপর সেখানে ঘুরে বেড়াবেন, ফাইল বানাবেন, কপি করবেন, মুছবেন, ফাইলের ভেতরে খুঁজবেন আর কয়েকটা কমান্ড জোড়া লাগাবেন — মডেল ট্রেনিংয়ের আগে একটা CSV পরীক্ষা করতে বা API-র লগে এরর খুঁজতে ঠিক এই কাজগুলোই করবেন।
যা শিখবেন
- টার্মিনাল, শেল আর কমান্ড কী, আর Windows, macOS ও Linux-এ কোন শেল ব্যবহার করবেন
- ফাইল আর ফোল্ডার কীভাবে সাজানো থাকে, আর অ্যাবসোলিউট ও রিলেটিভ পাথের পার্থক্য (
/,~,.,..) - রোজকার কমান্ড:
pwd ls cd mkdir touch cp mv rm cat echo head tail grep - ওয়াইল্ডকার্ড, পাইপ (
|) আর রিডাইরেকশন (>,>>,2>) - কোনো ফ্ল্যাগ ভুলে গেলে কীভাবে সাহায্য পাবেন
টার্মিনাল, শেল আর কমান্ড
তিনটা শব্দ সবসময় গুলিয়ে যায়। আসলে এগুলো আলাদা আলাদা স্তর:
| শব্দ | এটা কী | উদাহরণ |
|---|---|---|
| টার্মিনাল (terminal emulator) | যে উইন্ডোতে আপনি টাইপ করেন। এটা শুধু লেখা দেখায় আর আপনার কি-চাপা ভেতরে পাঠিয়ে দেয়। | Windows Terminal, macOS Terminal, iTerm2, GNOME Terminal, VS Code-এর ভেতরের টার্মিনাল প্যানেল |
| শেল (shell) | টার্মিনালের ভেতরে চলা প্রোগ্রাম, যা আপনার টাইপ করা লাইন পড়ে, তার মানে বোঝে আর সেটা চালায়। | bash (Linux, Windows-এ Git Bash), zsh (macOS-এর ডিফল্ট), PowerShell আর cmd (Windows) |
| কমান্ড | একটা প্রোগ্রাম বা শেলের নিজস্ব (built-in) নির্দেশ, যা একটা কাজ করে। | ls, git, python, curl, cd |
এই কোর্সের প্রতিটা কমান্ড লেখা bash-এর জন্য। macOS-এর zsh এগুলোর সবই বোঝে। Windows-এ ব্যবহার করুন Git Bash (Git for Windows ইনস্টল করলে সাথেই আসে, আর সেটা আপনার এমনিতেও লাগবে), অথবা ব্যাকএন্ডের কাজের জন্য আরও ভালো WSL 2 (Windows-এর ভেতরে আসল একটা Ubuntu: অ্যাডমিনিস্ট্রেটর PowerShell-এ wsl --install, তারপর রিস্টার্ট)। PowerShell-ও ভালো শেল, কিন্তু এর কমান্ডগুলো আলাদা; পাতার শেষের দিকে একটা টেবিলে জরুরি পার্থক্যগুলো দেওয়া আছে।
কোনো গাইডে $ ls ধরনের লাইন দেখলে জানবেন, $ হলো প্রম্পট — শেলের "আমি তৈরি" বলার ধরন। আপনি টাইপ করবেন শুধু এর পরের অংশটা। এই কোর্সে প্রম্পট বাদ দিয়ে লেখা হয়েছে, যাতে প্রতিটা ব্লক যেমন আছে তেমনই কপি করা যায়। প্রতিটা কমান্ড লাইনে প্রথমে থাকে কমান্ডের নাম, তারপর অপশন (ফ্ল্যাগ, যেমন -n 3 বা --help), তারপর আর্গুমেন্ট (সাধারণত ফাইলের নাম) — মাঝে স্পেস দিয়ে আলাদা করা।
আমি কোথায়? ফাইল, ফোল্ডার আর পাথ
আপনার ফাইলগুলো থাকে ফোল্ডারের (ডিরেক্টরির) একটা বড় গাছে। Linux আর macOS-এ গাছের মাথা হলো / (রুট), আর আপনার নিজের ফাইল থাকে আপনার হোম ফোল্ডারে: Linux-এ /home/<আপনার-নাম>, macOS-এ /Users/<আপনার-নাম>। শেলের সবসময় একটা কারেন্ট ওয়ার্কিং ডিরেক্টরি থাকে — যে ফোল্ডারে আপনি "দাঁড়িয়ে" আছেন। pwd (print working directory) সেটা দেখায়:
pwd/home/nadiaএই কোর্সের শিক্ষার্থী নাদিয়া, তাই তার হোম ফোল্ডার /home/nadia; আপনার ক্ষেত্রে দেখাবে আপনার নিজের নাম। এবার একটা অনুশীলনের ফোল্ডার বানিয়ে তাতে ঢুকি। mkdir -p একটা ফোল্ডার বানায়, আর পথে যেসব প্যারেন্ট ফোল্ডার নেই সেগুলোও বানিয়ে নেয়; cd (change directory) আপনাকে অন্য ফোল্ডারে নিয়ে যায়:
mkdir -p ~/projects/terminal-practice
cd ~/projects/terminal-practice
pwd/home/nadia/projects/terminal-practiceঅ্যাবসোলিউট আর রিলেটিভ পাথ
পাথ (path) দিয়ে একটা ফাইল বা ফোল্ডারের ঠিকানা বোঝায়। পাথ দুই রকম, আর এ দুটো গুলিয়ে ফেলাই স্ক্রিপ্ট "ফাইল খুঁজে না পাওয়ার" সবচেয়ে সাধারণ কারণ:
| পাথ | মানে | উদাহরণ |
|---|---|---|
| অ্যাবসোলিউট | রুট / থেকে শুরু; আপনি যেখানেই থাকুন, মানে একই | /home/nadia/projects/terminal-practice/data |
| রিলেটিভ | কারেন্ট ফোল্ডার থেকে শুরু | data/reviews.csv |
~ | আপনার হোম ফোল্ডার (শেল এটা পুরো পাথে বদলে নেয়) | ~/projects |
. | কারেন্ট ফোল্ডার | ./run.sh |
.. | প্যারেন্ট ফোল্ডার, এক ধাপ ওপরে | ../other-project |
Python-ও একই নিয়ম মানে: open("data/reviews.csv") রিলেটিভ সেই ফোল্ডারের সাপেক্ষে, যেখান থেকে আপনি Python চালিয়েছেন — স্ক্রিপ্টটা যে ফোল্ডারে আছে সেটার সাপেক্ষে নয়। এ কারণেই একই স্ক্রিপ্ট এক ফোল্ডার থেকে চলে, আর অন্য ফোল্ডার থেকে FileNotFoundError দিয়ে ফেল করে।
ফাইল বানানো: echo, রিডাইরেকশন, touch আর cat
echo তার আর্গুমেন্টগুলো প্রিন্ট করে। > দিলে আউটপুট স্ক্রিনে না গিয়ে একটা ফাইলে যায় (রিডাইরেকশন); >> দিলে ফাইলের শেষে যোগ হয়। cat একটা ফাইল প্রিন্ট করে:
echo "Notes for the Git, APIs and Backend course" > notes.txt
cat notes.txt
echo "Day 1: the terminal" >> notes.txt
cat notes.txtNotes for the Git, APIs and Backend course
Notes for the Git, APIs and Backend course
Day 1: the terminal
>কিছু জিজ্ঞেস না করেই পুরো ফাইলটা বদলে দেয়।>>শেষে যোগ করে।>>-এর জায়গায় ভুল করে>লিখলে আগের সব লেখা চুপচাপ মুছে যায় — জরুরি ফাইল হলে দুবার দেখে নিন।
touch একটা খালি ফাইল বানায় (ফাইল আগে থেকে থাকলে শুধু তার সময় হালনাগাদ করে)। ls একটা ফোল্ডারের ভেতরে কী আছে তার তালিকা দেয়; -a দিলে লুকানো জিনিসও দেখায় (যেসব নামের শুরুতে বিন্দু, যেমন এই কোর্সে পরে আসা .env আর .git), আর -F ফোল্ডারের নামের শেষে একটা / বসিয়ে চিনিয়ে দেয়:
touch app.py .env
mkdir data logs
ls
ls -a
ls -Fapp.py
data
logs
notes.txt
.
..
.env
app.py
data
logs
notes.txt
app.py
data/
logs/
notes.txt. আর .. প্রতিটা ফোল্ডারেই থাকে: এরা হলো ফোল্ডারটা নিজে আর তার প্যারেন্ট — পাথে যেগুলো ব্যবহার করেন, সেগুলোই। ls -l (লং ফরম্যাট) প্রতিটা লাইনে পারমিশন, মালিক, সাইজ আর শেষ বদলের সময় যোগ করে, আর ls -lh সাইজ দেখায় 4.0K বা 2.1M আকারে; চালিয়ে দেখুন, প্রতিটা মেশিনে এর ফল আলাদা হয়।
পুরো একটা ফাইল একবারে লেখা
কয়েক লাইনের ফাইলের জন্য হিয়ার-ডকুমেন্ট (here-document) খুব কাজের: <<'EOF' আর EOF লাইনের মাঝের সবকিছু কমান্ডের ইনপুটে যায়। কোর্স রিভিউয়ের একটা ছোট ডেটাসেট আর LLM-চালিত একটা API-র লগ বানান — পাতার বাকিটা জুড়ে এ দুটোই ঘেঁটে দেখবেন:
cat > data/reviews.csv <<'EOF'
id,course,rating,comment
1,Python for AI,5,Clear and practical
2,SQL and Data Handling,4,Good exercises
3,Python for AI,4,Loved the projects
4,Maths for AI,3,A bit fast
5,SQL and Data Handling,5,Joins finally make sense
6,Python for AI,2,Setup was hard on Windows
7,Maths for AI,5,Great intuition for vectors
EOF
cat > logs/app.log <<'EOF'
2026-01-15 10:00:01 INFO POST /v1/chat 200 812ms tokens=153
2026-01-15 10:00:04 INFO GET /health 200 2ms
2026-01-15 10:00:09 ERROR POST /v1/chat 502 30004ms upstream timeout
2026-01-15 10:00:12 INFO POST /v1/chat 200 640ms tokens=98
2026-01-15 10:00:15 WARN POST /v1/chat 429 5ms rate limited
2026-01-15 10:00:21 ERROR POST /v1/chat 500 12ms KeyError: 'choices'
2026-01-15 10:00:30 INFO GET /v1/courses 200 9ms
EOF
ls data logsdata:
reviews.csv
logs:
app.log'EOF'-এর উদ্ধৃতিচিহ্ন bash-কে বলে লাইনগুলো হুবহু কপি করতে, ভেতরের $HOME-এর মতো কিছু বদলে না দিতে। ছোট কনফিগ আর JSON ফাইল লিখতে এই প্যাটার্ন আবার ব্যবহার করবেন।
ফাইলের ভেতরে দেখা: head, tail, wc
আসল ডেটাসেটে লাখ লাখ লাইন থাকতে পারে; তাতে cat চালালে স্ক্রিন ভেসে যাবে। বরং শুরু আর শেষটা দেখুন, আর লাইন গুনুন:
head -n 3 data/reviews.csv
tail -n 2 logs/app.log
wc -l data/reviews.csv logs/app.logid,course,rating,comment
1,Python for AI,5,Clear and practical
2,SQL and Data Handling,4,Good exercises
2026-01-15 10:00:21 ERROR POST /v1/chat 500 12ms KeyError: 'choices'
2026-01-15 10:00:30 INFO GET /v1/courses 200 9ms
8 data/reviews.csv
7 logs/app.log
15 totalhead দেখাল হেডার সারি আর প্রথম দুটো রিভিউ — pandas দিয়ে CSV লোড করার আগে ঠিক এটাই যাচাই করেন: কলামের নামগুলো ঠিক আছে তো, সেপারেটর কমা তো? wc -l লাইন গোনে: ৮ লাইন মানে ১টা হেডার আর ৭টা রিভিউ। সার্ভারে tail -f logs/app.log ফাইলটা খোলা রাখে আর নতুন লাইন আসামাত্র প্রিন্ট করে; থামাতে Ctrl+C চাপুন (Ctrl+C যেকোনো চলমান কমান্ড থামায়)।
খোঁজা: grep
grep সেই লাইনগুলো প্রিন্ট করে, যেগুলোতে একটা প্যাটার্ন আছে। -n লাইন নম্বর যোগ করে, -i বড়-ছোট হাতের অক্ষরের পার্থক্য উপেক্ষা করে, -c লাইন না দেখিয়ে মিল পাওয়া লাইন গোনে, -v মিলটা উল্টে দেয়, আর -r একটা ফোল্ডারের নিচের সব ফাইলে খোঁজে:
grep ERROR logs/app.log
grep -n "429" logs/app.log
grep -c "/v1/chat" logs/app.log
grep -i "windows" data/reviews.csv
grep -r "Python for AI" .2026-01-15 10:00:09 ERROR POST /v1/chat 502 30004ms upstream timeout
2026-01-15 10:00:21 ERROR POST /v1/chat 500 12ms KeyError: 'choices'
5:2026-01-15 10:00:15 WARN POST /v1/chat 429 5ms rate limited
5
6,Python for AI,2,Setup was hard on Windows
./data/reviews.csv:1,Python for AI,5,Clear and practical
./data/reviews.csv:3,Python for AI,4,Loved the projects
./data/reviews.csv:6,Python for AI,2,Setup was hard on Windowsখেয়াল করুন, grep -r প্রতিটা মিলের আগে ফাইলের নাম লিখেছে, কারণ এটা একাধিক ফাইলে খুঁজেছে। প্রোডাকশনে কোনো LLM এন্ডপয়েন্ট গোলমাল করলে প্রায়ই সবার আগে চালানো কমান্ড হলো তার লগে grep ERROR; এখানে সেটা পেয়েছে একটা আপস্ট্রিম টাইমআউট (মডেল প্রোভাইডার খুব দেরি করেছে) আর একটা KeyError (কোড এমন একটা ফিল্ড আশা করেছিল, যা রেসপন্সে ছিল না)।
পাইপ: ছোট ছোট কমান্ড, একসাথে
পাইপ | একটা কমান্ডের আউটপুট পরের কমান্ডের ইনপুটে পাঠায়। প্রতিটা টুল একটা ছোট কাজ করে; জোড়া লাগালে সত্যিকারের প্রশ্নের উত্তর দেয়। এরর কয়টা? কোন কোন রেটিং আছে, কোনটা কতবার?
grep ERROR logs/app.log | wc -l
tail -n +2 data/reviews.csv | cut -d, -f3 | sort | uniq -c2
1 2
1 3
2 4
3 5দ্বিতীয় লাইনটা বাঁ থেকে ডানে পড়ুন: tail -n +2 দ্বিতীয় লাইন থেকে প্রিন্ট করে (হেডার বাদ), cut -d, -f3 কমা দিয়ে আলাদা করা তৃতীয় ফিল্ডটা (রেটিং) রাখে, sort সমান মানগুলো পাশাপাশি আনে, আর uniq -c একই লাইনের প্রতিটা দল গোনে। Python চালু না করেই একটা ছোট্ট value_counts()। (cut প্রতিটা কমায় ভাগ করে, তাই এটা শুধু সাধারণ CSV-তে নিরাপদ; কোনো কমেন্টে কমা থাকলে কলাম সরে যাবে — আসল ডেটার জন্য pandas ব্যবহার করুন।)
কপি, সরানো, নাম বদল আর মোছা
| কমান্ড | কাজ |
|---|---|
cp a b | a ফাইলটা b-তে কপি করে (ফোল্ডারের জন্য cp -r) |
mv a b | a-কে b-তে সরায়; একই ফোল্ডারের ভেতরে এটাই নাম বদল |
rm a | a ফাইলটা মুছে দেয় (ফোল্ডার আর তার ভেতরের সবকিছুর জন্য rm -r) |
rmdir d | d ফোল্ডারটা মোছে, শুধু যদি সেটা খালি হয় |
mkdir backup
cp data/reviews.csv backup/reviews-2026-01-15.csv
mv notes.txt course-notes.txt
mv app.py backup/
ls
ls backupbackup
course-notes.txt
data
logs
app.py
reviews-2026-01-15.csvcp বা mv-এর শেষ আর্গুমেন্ট যদি আগে থেকে থাকা কোনো ফোল্ডার হয়, ফাইলটা নাম না বদলে তার ভেতরে চলে যায়। এবার ব্যাকআপ ফোল্ডারটা মুছে দিন:
rm -r backup
lscourse-notes.txt
data
logsটার্মিনালে কোনো রিসাইকেল বিন নেই।
rmসাথে সাথে চিরতরে মুছে দেয়, আরrm -rপুরো ফোল্ডার-গাছটাই নিয়ে যায়। আগেpwdআরlsচালান; এমন কোনো পাথে কখনোrm -rfচালাবেন না, যা একটা ভেরিয়েবল থেকে বানানো আর সেই ভেরিয়েবল খালি হতে পারে; আর শেখার সময়rm -iব্যবহার করুন (প্রতিটা ফাইলের আগে জিজ্ঞেস করে)। ভার্সন কন্ট্রোল ও আপনার প্রথম রিপোজিটরি থেকে Git হবে আপনার আসল সেফটি নেট।
এদিক-ওদিক যাওয়া: cd, ., .. আর ~
cd data
pwd
ls ..
cd ..
pwd
cd ~
pwd
cd -/home/nadia/projects/terminal-practice/data
course-notes.txt
data
logs
/home/nadia/projects/terminal-practice
/home/nadia
/home/nadia/projects/terminal-practicecd .. এক ধাপ ওপরে যায়, cd ~ (বা শুধু cd) হোমে নিয়ে যায়, আর cd - আগের ফোল্ডারে ফিরে গিয়ে কোথায় পৌঁছাল তা প্রিন্ট করে। দুটো কিবোর্ড-কি অনেক টাইপিং বাঁচায়: Tab ফাইল আর ফোল্ডারের নাম পূর্ণ করে দেয় (বিকল্পগুলো দেখতে দুবার চাপুন), আর ওপরের তীরচিহ্ন আগের কমান্ডগুলো ফিরিয়ে আনে।
ওয়াইল্ডকার্ড
কমান্ড চলার আগেই শেল ওয়াইল্ডকার্ডগুলোকে মিলে যাওয়া ফাইলের নামে বদলে দেয়: * যেকোনো অক্ষরের সাথে মেলে, ? ঠিক একটা অক্ষরের সাথে, [0-9] একটা সেটের যেকোনো একটা অক্ষরের সাথে। echo দিয়ে দেখা যায় ওয়াইল্ডকার্ড কীসে বদলাল:
touch run-1.log run-2.log run-10.log
echo *.log
echo run-?.log
ls data/*.csvrun-1.log run-10.log run-2.log
run-1.log run-2.log
data/reviews.csvদুটো জিনিস খেয়াল করুন। run-?.log run-10.log-এর সাথে মেলেনি, কারণ ? মানে ঠিক একটা অক্ষর। আর নামগুলো সাজানো হয় লেখা হিসেবে, অক্ষর ধরে ধরে, তাই run-10 আগে আসে run-2-এর। এ কারণেই এক্সপেরিমেন্টের ফোল্ডারে সাধারণত সামনে শূন্য বসানো হয় (run-01, run-02, … run-10)। শেল যেহেতু ওয়াইল্ডকার্ড বদলে দেয়, rm *.log ফোল্ডারের প্রতিটা .log ফাইল মুছে ফেলে — আগে echo *.log চালিয়ে দেখে নিন কোনগুলো মুছবে।
নামে স্পেস
শেল কমান্ড লাইনকে স্পেসে স্পেসে ভাগ করে, তাই স্পেসওয়ালা ফাইলের নাম উদ্ধৃতিচিহ্নের ভেতরে লিখতে হয়:
echo "draft" > "meeting notes.txt"
cat "meeting notes.txt"
cat meeting notes.txtdraft
cat: meeting: No such file or directory
cat: notes.txt: No such file or directoryউদ্ধৃতিচিহ্ন ছাড়া cat পেয়েছে দুটো আর্গুমেন্ট, meeting আর notes.txt, আর দুটো ফাইল খুঁজেছে। নিজে যেসব ফাইল বানাবেন, তাতে স্পেস একেবারেই এড়িয়ে চলুন: meeting-notes.txt বা meeting_notes.txt।
এরর, এক্সিট কোড আর আউটপুটের দুটো ধারা
প্রতিটা কমান্ড শেষ হয় একটা এক্সিট কোড (exit code) দিয়ে: 0 মানে সফল, অন্য যেকোনো সংখ্যা মানে ব্যর্থ। $?-এ থাকে সর্বশেষটা। কমান্ডের আউটপুটের দুটো ধারাও থাকে: সাধারণ আউটপুট (stdout) আর এরর মেসেজ (stderr)। > শুধু stdout সরায়; 2> সরায় stderr:
ls no-such-folder
echo "exit code: $?"
ls no-such-folder 2> errors.txt
cat errors.txt
ls data > listing.txt 2>&1
cat listing.txtls: cannot access 'no-such-folder': No such file or directory
exit code: 2
ls: cannot access 'no-such-folder': No such file or directory
reviews.csv2>&1 মানে "stderr-কেও সেখানে পাঠাও, যেখানে stdout যাচ্ছে", তাই command > file 2>&1 সবকিছু ধরে রাখে। পরে ঠিক এটা দিয়েই একটা API সার্ভার ব্যাকগ্রাউন্ডে চালাবেন, লগটা থাকবে একটা ফাইলে। এক্সিট কোড দেখতে যত সামান্য, কাজে তার চেয়ে অনেক বড়: CI পাইপলাইন (GitHub Actions), Docker হেলথ চেক আর টেস্ট রানার — সবাই "পাস না ফেল" ঠিক করে এটা দেখেই।
সাহায্য পাওয়া
প্রতিটা ফ্ল্যাগ কেউই মনে রাখে না। খুঁজে দেখার তিনটা উপায়:
head --help | head -n 3
type cd
type grepUsage: head [OPTION]... [FILE]...
Print the first 10 lines of each FILE to standard output.
With more than one FILE, precede each with a header giving the file name.
cd is a shell builtin
grep is /usr/bin/grepcommand --helpLinux, Git Bash আর WSL-এ একটা ছোট সারাংশ প্রিন্ট করে (macOS-এর নিজস্ব টুলগুলো বেশিরভাগই এটা বোঝে না; সেখানেmanব্যবহার করুন)।man commandপুরো ম্যানুয়াল খোলে: স্ক্রল করতে তীরচিহ্ন, খুঁজতে/word, বের হতেq।typeবলে দেয় নামটা শেলের নিজস্ব কমান্ড (cd-কে তা হতেই হয়, কারণ এটা শেলের নিজের ফোল্ডার বদলায়), নাকি ডিস্কের কোনো প্রোগ্রাম ফাইল।
Git-এও একই ধরন: git help commit বা git commit -h। আর কোনো AI অ্যাসিস্ট্যান্টকে "tail -n +2 কী করে?" জিজ্ঞেস করা একদম ভালো অভ্যাস — তারপর --help দিয়ে তার উত্তরটা মিলিয়ে নিন।
Windows: Git Bash, WSL আর PowerShell
Git Bash বা WSL-এ এই পাতার প্রতিটা কমান্ড যেমন লেখা তেমনই চলে। Windows-এ দুটো জিনিস জেনে রাখুন: আপনার C: ড্রাইভ Git Bash-এ দেখায় /c/ হিসেবে আর WSL-এ /mnt/c/ হিসেবে, আর Windows-এর পাথে \ ব্যবহার হয়, bash-এ /। যদি PowerShell-এ কাজ করেন, তাহলে জরুরি পার্থক্যগুলো এই (bash-এর অনেক নাম সেখানে অ্যালিয়াস হিসেবে আছে, কিন্তু অপশনগুলো আলাদা):
| bash | PowerShell |
|---|---|
pwd, cd, ls | অ্যালিয়াস হিসেবে চলে (Get-Location, Set-Location, Get-ChildItem); লুকানো ফাইল দেখতে ls -Force |
cat file | Get-Content file (cat অ্যালিয়াস হিসেবেও চলে) |
head -n 3 file / tail -n 3 file | Get-Content file -TotalCount 3 / Get-Content file -Tail 3 |
touch file | New-Item file |
mkdir -p a/b | mkdir a/b (প্যারেন্ট ফোল্ডার নিজেই বানায়) |
rm -r folder | Remove-Item folder -Recurse |
grep ERROR file | Select-String ERROR file |
wc -l file | (Get-Content file).Count |
আমাদের পরামর্শ: Git for Windows ইনস্টল করে এই কোর্সে Git Bash ব্যবহার করুন, পারলে WSL 2। সার্ভার আর Docker কন্টেইনার চলে Linux-এ, তাই bash-এর অভ্যাস সরাসরি কাজে লাগে।
AI আর ব্যাকএন্ডের কাজে এগুলো কোথায় লাগে
- ট্রেনিংয়ের আগে ডেটা যাচাই: একটা CSV বা JSONL ফাইলে
head,wc -lআরgrep -cএক সেকেন্ডে বলে দেয় ফাইলটা পুরো আছে কি না, আর আপনার কোড যে গড়ন আশা করে সেরকম কি না। - ডিপ্লয় করা API ডিবাগ: সার্ভারে বা কন্টেইনারের ভেতরে
cdদিয়ে অ্যাপের ফোল্ডারে যান, লগেtailচালান, আরERROR, একটা রিকোয়েস্ট আইডি বা429-এর মতো স্ট্যাটাস কোড দিয়েgrepকরেন। - লম্বা জব চালানো:
python train.py > train.log 2>&1একটা ট্রেনিং রানের পুরো রেকর্ড রেখে দেয়, পরে যাতে খোঁজা যায়। - অটোমেশন: CI ওয়ার্কফ্লো, Dockerfile আর ডিপ্লয়মেন্ট স্ক্রিপ্ট আসলে এই কমান্ডগুলোই, লিখে রাখা — এই কোর্সে তিনটাই লিখবেন।
সাধারণ ভুল
- ভুল ফোল্ডারে কমান্ড চালানো।
No such file or directoryমানে সাধারণত আপনি যে ফোল্ডারে আছেন ভাবছেন, আসলে সেখানে নেই।pwdআরlsচালান, তারপরcdদিয়ে ঠিক জায়গায় যান, অথবা অ্যাবসোলিউট পাথ ব্যবহার করুন। - প্রম্পটও টাইপ করা।
$-সহ$ lsকপি করলে আসে$: command not found। শুধু প্রম্পটের পরের অংশটা টাইপ করুন। - স্পেসওয়ালা নাম উদ্ধৃতিচিহ্ন ছাড়া লেখা।
cd My Documentsযেতে চায়My-তে। উদ্ধৃতিচিহ্ন দিন (cd "My Documents") অথবা Tab চেপে শেলকেই সামলাতে দিন। >>-এর জায়গায়>। একটা অক্ষর পুরো ফাইল খালি করে দেয়। যোগ করতে>>ব্যবহার করুন, আর জরুরি ফাইল Git-এ রাখুন, যাতে ভুল হলে ফেরানো যায়।- অসাবধানে
rm -rf। কোনো আনডু নেই। মোছার আগেlsদিয়ে (ওয়াইল্ডকার্ড হলেechoদিয়ে) পাথটা দেখে নিন।
নিজে চেষ্টা করুন
- সহজ:
~/projects/terminal-practice-এ একটা কমান্ডেইexperiments/run-01আরexperiments/run-02ফোল্ডার বানান,run-01-এlearning_rate=0.01লেখা একটাparams.txtফাইল রাখুন, আর সেটা প্রিন্ট করুন। - মাঝারি:
logs/app.logথেকে প্রতিটাPOST /v1/chatলাইনchat.log-এ সেভ করুন, তারপর তাতে কয় লাইন আছে প্রিন্ট করুন। তারপর আগের লেখা না হারিয়ে একই ফাইলের শেষেGET /healthলাইনটা যোগ করুন। - কঠিন:
logs/app.logথেকে প্রতিটা HTTP স্ট্যাটাস কোড আর সেটা কতবার এসেছে তার তালিকা করুন, সবচেয়ে বেশিবারেরটা আগে। (ইঙ্গিত: স্ট্যাটাস কোড হলো স্পেস দিয়ে আলাদা করা ৬ নম্বর ফিল্ড;INFO-এর পরের দুটো স্পেসেcut -d' ' -f6গোলমাল করে, তাইawk '{print $6}'চেষ্টা করুন, তারপরsort,uniq -cআরsort -rn।)
উত্তর
১. mkdir -p একসাথে কয়েকটা পাথ নিতে পারে:
cd ~/projects/terminal-practice
mkdir -p experiments/run-01 experiments/run-02
echo "learning_rate=0.01" > experiments/run-01/params.txt
cat experiments/run-01/params.txt
ls experimentslearning_rate=0.01
run-01
run-02২. > ফাইল বানায়, >> শেষে যোগ করে:
grep "POST /v1/chat" logs/app.log > chat.log
wc -l chat.log
grep "GET /health" logs/app.log >> chat.log
wc -l chat.log5 chat.log
6 chat.log৩. awk যতগুলো স্পেসই থাকুক সেখানে ভাগ করে, তাই INFO-এর পরের বাড়তি স্পেসে কিছু যায় আসে না। শেষের sort -rn গণনা অনুযায়ী সাজায়, বড়টা আগে:
awk '{print $6}' logs/app.log | sort | uniq -c | sort -rn 4 200
1 502
1 500
1 429সারসংক্ষেপ
- টার্মিনাল হলো উইন্ডো, শেল (bash, zsh, PowerShell) আপনার টাইপ করা লাইন বোঝে, আর কাজটা করে কমান্ড। Windows-এ এই কোর্সের জন্য Git Bash বা WSL 2 ব্যবহার করুন।
- অ্যাবসোলিউট পাথ শুরু হয়
/থেকে; রিলেটিভ পাথ শুরু হয় কারেন্ট ফোল্ডার (pwd) থেকে।~হোম,.এখানে,..এক ধাপ ওপরে। ls cd mkdir touch cp mv rmদিয়ে ফাইল সামলান;cat head tail wc grepদিয়ে ভেতরে দেখেন।rm-এর কোনো আনডু নেই।- ওয়াইল্ডকার্ড বদলায় শেল;
|কমান্ড জোড়া লাগায়;>ফাইল নতুন করে লেখে,>>শেষে যোগ করে,2>এরর ধরে,> file 2>&1সবকিছু ধরে। - এক্সিট কোড 0 মানে সফল — CI, Docker আর টেস্ট টুল সবাই এর ওপর নির্ভর করে। "এটা কীভাবে কাজ করে?"-এর উত্তর দেয়
--help,manআরtype।
এরপর: এনভায়রনমেন্ট ভেরিয়েবল, .env ফাইল ও ভার্চুয়াল এনভায়রনমেন্ট পাতায় টার্মিনাল দিয়েই একটা Python প্রজেক্ট ঠিকভাবে সাজাবেন: সেটিংস আর API কি কোথায় থাকে, শেল প্রোগ্রাম কীভাবে খুঁজে পায়, আর venv ও uv দিয়ে প্রতিটা প্রজেক্ট কীভাবে নিজের আলাদা প্যাকেজ পায়।