Thoạt nhìn, terminal trông khá khó gần: một cửa sổ tối màu, con trỏ nhấp nháy và không có nút bấm quen thuộc nào. Thực tế thì đơn giản hơn nhiều. Đây là cách trực tiếp để bảo máy tính cần làm gì: một lệnh hiển thị file, lệnh khác chuyển sang thư mục cần thiết, lệnh thứ ba chạy chương trình.
Hầu hết những chỗ vướng lúc mới làm việc với agent không nằm ở cách diễn đạt yêu cầu, mà ở chỗ terminal đang đứng sai thư mục. Vì vậy, trước tiên chúng ta sẽ làm rõ chuyện thư mục và đường dẫn, còn lệnh claude để sau. Cuối bài, chúng ta sẽ áp dụng tất cả những điều này vào codegym-project, nơi mỗi bài tập là một project riêng.
Terminal - cách trực tiếp để điều khiển project
Terminal là cửa sổ để bạn điều khiển máy tính bằng các lệnh dạng văn bản. Thay vì lục tìm đúng nút trong menu, bạn gọi tên hành động một cách chính xác: hiển thị file, mở thư mục, chạy chương trình.
Dùng chuột thì nhanh hơn, nhưng chỉ cho đến khi bạn phải lặp lại cùng một thao tác lần thứ mười. Đổi lại, terminal mang đến cho bạn những điều sau:
- mỗi lệnh làm đúng một việc cụ thể - kết quả hiện ngay trong cùng cửa sổ, không phải đoán;
- một chuỗi thao tác dễ lặp lại - kiểm tra thư mục, xem file, chuyển sang thư mục khác và khởi chạy;
- bạn thấy được trạng thái mà giao diện che đi - trước hết là thư mục hiện tại.
Không cần phải chọn một trong hai. Trong IDEA, tìm file bằng mắt và mở bằng một cú nhấp chuột rất tiện, còn trong terminal thì tiện chạy một lệnh chính xác và thấy ngay phản hồi. Trên thực tế, hai cách này luôn song hành với nhau.
Khi bạn gõ claude, agent bắt đầu làm việc từ thư mục hiện tại của terminal. Vì vậy, nên xác định terminal đang ở đâu trước, rồi mới khởi chạy agent.

Năm lệnh cho công việc hằng ngày
Năm thao tác. Trong thời gian đầu, chừng này thật sự là đủ. Trên Windows chúng ta dùng PowerShell, còn trên macOS và Linux là terminal mặc định. Các lệnh ngắn trông giống hệt nhau ở cả ba hệ điều hành.
| Lệnh | Viết tắt của | Tác dụng |
|---|---|---|
pwd | print working directory - "in ra thư mục làm việc" | In ra đường dẫn đầy đủ tới thư mục mà terminal đang đứng. |
ls | list - "danh sách" | Hiển thị các file và thư mục trong thư mục hiện tại. |
cd demo-project | change directory - "đổi thư mục" | Chuyển vào thư mục lân cận demo-project. |
cd .. | .. nghĩa là thư mục cha | Đưa terminal lên trên một cấp thư mục. |
claude | Tên chương trình cần chạy | Khởi chạy Claude Code từ thư mục hiện tại. |
Trong PowerShell, các lệnh ngắn chỉ là bí danh (alias) cho tiện: pwd gọi Get-Location, ls gọi Get-ChildItem, còn cd gọi Set-Location. Không cần e ngại những cái tên dài này, và lúc này cũng chưa cần nhớ chúng. Nhưng nhìn vào chúng thì thấy rõ ý nghĩa của từng lệnh.
Giờ chạy thử nhanh trên macOS hoặc Linux. Ban đầu terminal đứng ở thư mục projects, sau đó chuyển vào demo-project:

Hãy nhìn vào phần cuối của đường dẫn: projects đã đổi thành demo-project. Chẳng có phép màu nào cả. Lệnh cd không mở file mới và cũng không sao chép gì, nó chỉ chuyển vị trí hiện tại của terminal sang một thư mục khác.
Những phím giúp tiết kiệm thời gian
Có vài thói quen sẽ nhanh chóng giúp bạn tiết kiệm thời gian. Terminal lưu lịch sử những gì bạn đã gõ và giúp bạn gõ nốt những cái tên dài:
↑- hiển thị lệnh trước đó. Nhấn vài lần để lùi xa hơn trong lịch sử;↓- quay lại các lệnh mới hơn trong lịch sử;Tab- tự động hoàn thành tên lệnh, file hoặc thư mục. Ví dụ, gõcd demrồi nhấnTabđể đượccd demo-project;←và→- di chuyển con trỏ trong dòng, để sửa một chữ cái mà không phải gõ lại cả lệnh;Ctrl+C- thường dùng để dừng lệnh đang chạy, nếu bạn lỡ chạy nhầm hoặc tiến trình mãi không kết thúc;Ctrl+L- xóa phần hiển thị của terminal, nhưng không xóa file hay lịch sử lệnh.
Hay dùng nhất là phím mũi tên lên và Tab. Phím đầu gọi lại lệnh đã gõ, phím sau giúp bớt lỗi khi gõ những đường dẫn dài.
Thư mục, directory và đường dẫn
Bạn sao chép một đường dẫn vào lệnh, chuyển sang thư mục khác - và đúng lệnh đó không còn chạy được nữa. Không phải do gõ nhầm đâu: đường dẫn có hai loại, và một trong hai phụ thuộc vào việc terminal đang đứng ở đâu. Chúng ta sẽ xem cả hai.
Trước hết là chuyện tên gọi, phần này đơn giản hơn bạn nghĩ. Thư mục (folder) và directory là cùng một thứ.Trong giao diện người ta hay nói "thư mục" (folder), còn khi nói về terminal thì hay dùng "directory".
Đường dẫn (path) là địa chỉ của một thư mục trên ổ đĩa. Trên Windows, macOS và Linux, ký tự phân cách trông khác nhau, nhưng logic thì giống nhau: mỗi đoạn của đường dẫn đưa bạn vào sâu hơn một cấp. Đầu tiên là ổ đĩa hoặc thư mục gốc, tiếp theo là người dùng, thư mục chung chứa các project và cuối cùng là project cụ thể.
Đường dẫn đầy đủ và đường dẫn tuyệt đối là cùng một thứ, chỉ khác cách gọi. Loại đường dẫn này bắt đầu từ đỉnh của hệ thống file: từ ký tự ổ đĩa trên Windows hoặc từ ký tự / trên macOS và Linux. Nó luôn dẫn tới cùng một chỗ, bất kể terminal đang mở ở thư mục nào.
Đường dẫn tương đối thì ngược lại: nó mô tả lối đi tính từ thư mục hiện tại. Nhờ vậy nó ngắn hơn, vì không cần lặp lại phần đầu của địa chỉ. Nhưng chỉ cần chuyển sang thư mục khác là ý nghĩa của đường dẫn thay đổi.
Giả sử bên trong project có một file như sau:
demo-project/
└── src/
└── index.htmlTerminal đang mở ở thư mục gốc của demo-project. Đây là hai cách để tới cùng một file index.html:
| Hệ điều hành | Đường dẫn đầy đủ, hay tuyệt đối | Đường dẫn tương đối tính từ demo-project |
|---|---|---|
| Windows | C:\Users\student\projects\demo-project\src\index.html | .\src\index.html |
| macOS | /Users/student/projects/demo-project/src/index.html | ./src/index.html |
| Linux | /home/student/projects/demo-project/src/index.html | ./src/index.html |
Dấu chấm . nghĩa là "thư mục hiện tại". Vì vậy .\src\index.html và ./src/index.html được hiểu là "từ thư mục hiện tại, đi vào src và lấy index.html". Dấu chấm thường được bỏ đi: src\index.html và src/index.html có nghĩa y hệt.
Nếu đi lên từ demo-project vào thư mục chung projects, đường dẫn tương đối cũ sẽ không dùng được nữa. Từ vị trí mới, bạn cần .\demo-project\src\index.html trên Windows hoặc ./demo-project/src/index.html trên macOS và Linux. Còn đường dẫn đầy đủ thì vẫn giữ nguyên.
Đường dẫn có dấu cách phải đặt trong dấu ngoặc kép, nếu không terminal sẽ hiểu rằng sau dấu cách là một tham số khác:
cd "C:\Users\student\My Projects\demo-project"Vì sao thư mục hiện tại lại quan trọng
Terminal lúc nào cũng đứng ở một thư mục nào đó, kể cả trước lệnh đầu tiên. Thư mục đó được gọi là thư mục hiện tại hay thư mục làm việc (working directory). Các lệnh bắt đầu tìm file và tính đường dẫn tương đối từ chính thư mục này.
Bạn cần sao chép một file từ "Downloads" vào "Bí mật kế toán" nằm trong "Documents". Bạn sao chép file, đi hết đường tới đúng thư mục cần thiết và chỉ ở đó mới nhấn "Dán". File được ghi xuống ổ đĩa tại một địa chỉ cụ thể. Không ai dán file "vào đâu đó trong Documents" cả - lần nào bạn cũng đi tới đúng chỗ, chỉ là làm bằng chuột nên không để ý.
Trong terminal cũng vậy, chỉ khác là thay cho cửa sổ trình quản lý file, bạn có một dòng đường dẫn. Người chọn thư mục vẫn là bạn, và agent bắt đầu làm việc từ chính thư mục đó.
Về mặt kỹ thuật, bạn có thể mở terminal ở gốc ổ đĩa C:\. Nhưng đó có phải ý hay không? Không. Và lý do không phải là Claude Code sẽ lao vào đọc từng file trên ổ đĩa - nó sẽ không làm vậy. Vấn đề là bạn đã chọn một điểm xuất phát tồi:
- agent không có ranh giới rõ ràng của một project - ngay cạnh đó là file hệ thống, thư mục người dùng và các project khác của bạn;
- đường dẫn tương đối không bắt đầu ở chỗ bạn nghĩ -
srcbỗng nhiên không còn làsrcmà bạn muốn; - chỉ nhìn đường dẫn thì không biết được bạn đang làm việc với project nào.
Còn một chi tiết nhỏ nữa rất dễ vấp phải: file đang mở trong IDEA và thư mục hiện tại của terminal là hai trạng thái riêng biệt. Bạn có thể đang xem file của project này, trong khi terminal vẫn đứng ở project khác. Chuyển tab trong trình soạn thảo không kéo theo terminal đã mở.
Điểm xuất phát
Thư mục gốc của project (project root) là thư mục trên cùng, chứa các file liên quan của một project: code, cấu hình, tài liệu và những thứ cần thiết khác. Không cần học thuộc định nghĩa chính thức. Dễ hơn là nhìn vào vai trò của nó: thư mục này gom trọn một project lại với nhau.
Ví dụ, thư mục chung projects có thể chứa vài project độc lập:
projects/
├── demo-project/
│ ├── README.md
│ └── src/
└── calculator/
├── README.md
└── src/Trong cây thư mục này, projects chỉ là nơi chứa. Thư mục gốc của project thứ nhất là demo-project, của project thứ hai là calculator. Về mặt kỹ thuật, bạn có thể khởi chạy agent từ thư mục chung, nhưng ở đó ngữ cảnh hữu ích sẽ ít hơn: hai project chẳng liên quan gì đến nhau nằm cạnh nhau.
Trên thực tế, quy tắc rất ngắn gọn: tìm thư mục trên cùng của đúng project mà bạn muốn thay đổi, mở terminal ở đó và chạy các công cụ từ thư mục đó. Khi đó lệnh, file và hướng dẫn của project đều nằm trong một phạm vi rõ ràng.
Agent xem xét cấu trúc và các file xung quanh nhiệm vụ để hiểu ngữ cảnh. Nếu khởi chạy nó ở cấp quá cao, các project khác cũng sẽ nằm ngay bên cạnh. Với một yêu cầu không rõ ràng, agent có thể cho rằng chúng cũng liên quan đến nhiệm vụ, và trong lúc làm sẽ sửa cả những thứ không ai nhờ sửa.
Khi đang cuốn vào công việc, bạn dễ thấy kết quả mình mong đợi mà bỏ sót những chỉnh sửa thêm ở project bên cạnh. Vì vậy, chọn đúng thư mục làm việc không phải là thủ tục cho có, mà là một ranh giới rõ ràng cho agent.
codegym-project được tổ chức thế nào
Và giờ là trường hợp của CodeGym mà nãy giờ chúng ta hướng tới. Plugin IDEA tải các bài tập về một cây thư mục lớn duy nhất codegym-project. Nhìn từ bên ngoài, nó trông như một project, nhưng bên trong có một điểm mấu chốt: mỗi bài tập là một project riêng.
Không phải một file nằm lẫn trong đống chung, mà là một project thực thụ: có thư mục riêng, file riêng và quy tắc riêng cho agent trong .claude. Có bao nhiêu bài tập thì có bấy nhiêu project. theo đúng nghĩa đen.
Ở dạng đơn giản hóa, cây thư mục trông như thế này:
codegym-project/
└── src/vi/codegym/claude/course/level01/
├── task05/
│ ├── .claude/ # quy tắc của agent cho task05
│ └── arkanoid.html # file của bài tập này
└── task09/
├── .claude/ # quy tắc riêng cho task09
├── arkanoid.html
├── clicker.html
└── tictactoe.htmlĐây chính là những căn phòng trong phép so sánh ở trên, chỉ khác là giờ có số trên cửa: task05 và task09. Mỗi phòng có tài liệu riêng và quy tắc riêng, còn codegym-project là cả tòa nhà. Gọi trợ lý ra sảnh thôi thì chưa đủ, bạn phải nói rõ căn phòng đang chứa công việc hiện tại.
Bài tập bên cạnh không bổ sung gì cho ngữ cảnh của bài tập hiện tại. Để giải task09 thì không cần các file của task05, và quy tắc trong thư mục này không thay thế quy tắc của thư mục kia. Vì vậy, khi làm bài trên CodeGym, thư mục gốc của project là thư mục của bài tập cụ thể, chứ không phải codegym-project chung.
Đang giải task09? Hãy mở terminal trong task09 và chạy claude ở đó. Thư mục gốc chung của khóa học quá rộng cho việc này.
Khởi chạy agent trong thư mục bài tập
Tin vui là bạn không phải tự tay gõ địa chỉ dài. IDEA có thể mở terminal ngay trong thư mục bạn chọn.
Dưới đây là cách làm thủ công. Đúng là Claude Code có thể tự di chuyển giữa các thư mục và chạy lệnh trong đúng thư mục cần thiết. Nhưng vẫn nên tự làm một lần cho hiểu: bạn không phụ thuộc vào gợi ý của agent và thấy ngay ranh giới của bài tập hiện tại.
- Tìm
taskXXcần thiết trong cây project. - Nhấp chuột phải vào thư mục bài tập.
- Chọn
Open In-Terminal. - Kiểm tra thư mục hiện tại bằng lệnh
pwd. - Kiểm tra các file bằng lệnh
ls. - Đảm bảo đường dẫn kết thúc bằng đúng
taskXXcần thiết, sau đó chạyclaude.

Đôi khi IDEA hiển thị các thư mục package lồng nhau thành một dòng có dấu chấm, ví dụ vi.codegym.claude.course.level01. Đừng gõ lại dòng này như một đường dẫn trên ổ đĩa. Dễ hơn là mở terminal qua Open In - Terminal hoặc sao chép đường dẫn thật bằng Copy Path/Reference.
Nếu terminal đã mở sẵn trong codegym-project, bạn có thể tự chuyển thư mục:
cd src/vi/codegym/claude/course/level01/task09
pwd
ls
claudeBài tập mới - thư mục làm việc mới
Chuyển từ task05 sang task09? Phiên agent đang mở sẽ không tự đi theo tab của IDEA. Hãy kết thúc phiên đó bằng lệnh /exit, mở terminal trong bài tập mới, kiểm tra lại đường dẫn và chạy claude.
Đừng trộn nhiều bài tập khác nhau trong cùng một phiên. Trong cuộc hội thoại vẫn còn lại các file, quyết định và giả định trước đó, nên agent có thể mang ngữ cảnh cũ sang công việc mới. Kết quả là một mớ hỗn độn trộn lẫn hai bài tập, về sau rất khó gỡ.
Vì sao ngữ cảnh của phiên lại quan trọng đến vậy và quản lý nó thế nào, chúng ta sẽ tìm hiểu ở phần sau của khóa học. Còn bây giờ, hãy giữ một quy tắc đơn giản: bài tập mới - phiên mới.
Bạn có thể mở vài tab terminal, nhưng mỗi tab nên gắn với một bài tập rõ ràng. Lúc mới bắt đầu, đơn giản hơn là đóng phiên cũ trước khi chuyển sang bài khác, để khỏi phải đoán agent đang phục vụ project nào.
Đường dẫn kết thúc ở C:\, thư mục home hay codegym-project thay vì taskXX? Hãy dừng phiên, chuyển vào thư mục bài tập và khởi chạy lại agent. Sửa địa chỉ trước, rồi mới làm tiếp.
Tất cả kết hợp với Claude Code như thế nào
Hãy ghép mọi thứ lại thành một bức tranh. Terminal không chỉ cho Claude Code lệnh khởi chạy, nó còn đặt điểm xuất phát cho cấu trúc project, đường dẫn tương đối và các hướng dẫn cục bộ. Thư mục hiện tại cho biết công việc bắt đầu từ đâu, còn thư mục gốc của một project cho agent một bộ file liên quan với nhau, không lẫn nhiễu từ bên cạnh.
Từ đó có hai hệ quả rất dễ quên khi đang cuốn vào công việc. Tab đang mở trong IDE không làm thay đổi thư mục của phiên đang chạy, nên chuyển sang bài tập khác nghĩa là vừa đổi thư mục, vừa mở phiên riêng. Còn trong codegym-project, thư mục gốc của một project không nằm ở đỉnh cây, mà ở cấp của một taskXX cụ thể.
Trên thực tế, trước lệnh claude chỉ cần ba bước kiểm tra nhanh:
- Xem đường dẫn bằng
pwd. - Xem các file bằng
ls. - Đảm bảo bạn chỉ thấy đúng một project cần thiết, rồi mới khởi chạy agent.
Vậy thôi. Ở đây terminal không làm công việc phức tạp hơn, mà biến một thiết lập vô hình thành thứ nhìn thấy được: bạn biết chính xác mình đang ở đâu và đang giao project nào cho agent.
GO TO FULL VERSION