→ From Coder to Shipper
From Coder to Shipper · Nền tảng

Terminal / Shell

Cửa sổ để bạn nói chuyện với hệ điều hành — mỗi lần một dòng. Mọi thứ bạn chạy, triển khai hay gỡ lỗi đều bắt đầu từ đây.

← / → để chuyển slide · chuyển EN/VI bên dưới

Toàn cảnh

Terminal thực sự là gì

Một cửa sổ văn bản để bạn nói chuyện với hệ điều hành, mỗi lần một dòng — không nút bấm, không chuột.

Bạn gõ, nó thực thi

Một dòng chữ + Enter = một lệnh. Hệ điều hành làm đúng yêu cầu của bạn, rồi in ra kết quả.

Shell là người phiên dịch

Shell (bash, zsh) đọc dòng của bạn và chỉ cho hệ điều hành phải làm gì. Terminal chỉ là cửa sổ hiển thị.

Lệnh là những động từ nhỏ

cd, ls, grep — vài từ ngắn ghép lại thành bất cứ thứ gì. AI sẽ viết các lệnh dài cho bạn.

Không lưới an toàn

Không undo, không 'bạn có chắc không?' — hệ điều hành làm đúng những gì bạn gõ. Chính xác chính là kỹ năng.

Dòng prompt

Tôi là ai @ tôi ở đâu?

Mỗi lệnh bắt đầu bằng prompt: bạn là ai, máy nào, và đang đứng ở thư mục nào.

ops@vps — zsh
student@laptop:~/projects$ ls
app docs notes.md
student@laptop:~/projects$ cd ~/notes
student@laptop:~/notes$ pwd
/home/student/notes
← the prompt updated after the cd — it's your GPS
01
Phần 1

File & thư mục là một cái cây

Mọi thứ trên server là file, xếp trong các thư mục lồng nhau như nhánh cây. Bạn luôn đứng trong một thư mục nào đó.

Phần 1 · cái cây

Mọi vị trí đều là một đường dẫn

Đường dẫn chỉ là một địa chỉ. '/' là gốc của cái cây; đường dẫn là một hành trình đi xuống.

the-file-tree
/home/student            ← your home folder
├── projects
│   └── app
│       ├── index.py
│       └── config.yml
├── notes
│   └── ideas.md
└── .ssh                 ← dotfolder (hidden)

/home/student/projects/app   ← absolute: full address from /
projects/app                 ← relative: from where you stand

Đường dẫn tuyệt đối bắt đầu từ gốc; tương đối bắt đầu từ chỗ bạn đang đứng.

Phần 1 · đường dẫn

Tuyệt đối vs tương đối

Hai cách chỉ cùng một file. Tuyệt đối không bao giờ sai; tương đối ngắn hơn nhưng phụ thuộc chỗ bạn đứng.

Tuyệt đối — địa chỉ đầy đủ

Bắt đầu từ /: /home/student/notes/ideas.md. Hoạt động dù bạn đứng ở đâu.

Tương đối — từ chỗ bạn đứng

notes/ideas.md nghĩa là 'thư mục notes ngay cạnh chỗ tôi đang đứng'.

~ = thư mục home

~ là viết tắt của /home/<bạn>. ~/notes giúp bạn khỏi phải gõ địa chỉ đầy đủ.

Khi nào dùng cái nào

Tương đối cho việc nhanh cục bộ; tuyệt đối khi phải chạy từ mọi nơi (cấu hình, script).

Phần 1 · di chuyển

pwd, cd, ls — ba lệnh đầu tiên

Tên lệnh là những từ tiếng Anh rút gọn — đó là mẹo nhớ: pwd = in thư mục đang làm việc, cd = thay đổi thư mục, ls = liệt kê.

ops@vps — zsh
$ pwd ← print working directory — where am I?
/home/student
$ cd projects ← change directory — walk into a folder
$ ls ← list — what's in here?
app docs
$ ls -la ← -a shows hidden files, -l = full detail
drwxr-xr-x 2 student student 4096 app
-rw-r--r-- 1 student student 220 notes.md
$ cd .. ← up one level (.. = the parent folder)
$ cd ~ ← ~ = home, works from anywhere
Phần 1 · cảm nhận

Một hành trình đi xuống rồi quay lên

pwd sau mỗi bước — xem địa chỉ thay đổi. Đó là toàn bộ kỹ năng: luôn biết mình đang ở đâu.

ops@vps — zsh
$ pwd
/home/student
$ cd projects
$ cd app
$ pwd
/home/student/projects/app
$ cd .. ← one step back (.. = parent)
$ pwd
/home/student/projects
$ cd .. ← and back to home territory
$ pwd
/home/student
Phần 1 · mô hình tư duy

Thư mục hiện tại — 'bạn ở đây'

Shell giữ một con trỏ: thư mục bạn đang đứng. Đa số lệnh mặc định tác động lên nó.

cd di chuyển con trỏ

. = đứng yên, .. = lên một bậc, ~ = về nhà, / = gốc. Đó là toàn bộ cách di chuyển bạn cần.

Tên trần dùng tới nó

Gõ notes.md, shell tự tìm trong thư mục hiện tại — khỏi cần địa chỉ đầy đủ.

Cảm giác như đi bộ

Bạn không 'chạy chương trình trên server' — bạn là người đi bộ qua các thư mục, mở cửa dọc đường.

pwd = xem bản đồ

Mất đường? pwd cho biết chính xác bạn ở đâu. Lệnh được gõ lại nhiều nhất thế gian.

02
Phần 2

Tạo & quản lý file

Năm động từ đáp ứng gần như mọi thao tác với file — và tên lệnh lại là manh mối: tạo, chạm, chép, di chuyển, xóa.

Phần 2 · năm động từ

mkdir, touch, cp, mv, rm

Một phiên quản lý file trọn vẹn — đó là toàn bộ bộ công cụ.

ops@vps — zsh
$ mkdir site ← make directory — a new folder
$ touch site/index.html ← touch = stamp the file; creates it (empty)
$ cp site/index.html site/backup.html ← copy — clone the file
$ mv site/backup.html site/old.html ← move — relocate; also renames
$ ls site
index.html old.html
$ rm site/old.html ← remove — delete. No undo!
$ ls site
index.html
Phần 2 · đừng nhầm lẫn

cp nhân bản, mv di dời

Lỗi nhầm kinh điển: sau mv, file gốc biến mất. Sau cp, nó vẫn còn đó.

cp — bản sao

cp a b → cả a và b đều tồn tại. File gốc còn nguyên; b là bản sao độc lập (sửa cái này, cái kia không đổi).

mv — sự di dời

mv a b → chỉ còn b. File gốc biến mất. mv cũng là lệnh đổi tên: mv old.html new.html.

Phần 2 · cả thư mục

Làm việc với cả thư mục

Cùng động từ, thêm sức mạnh thư mục: -p xây đường dẫn lồng nhau, -r chép cả thư mục, và mv có thể thả file vào thư mục.

ops@vps — zsh
$ mkdir -p site/static/css ← -p: create every level at once
$ cp -r site site-backup ← -r: copy the whole folder, recursively
$ ls
site site-backup
$ mv site-backup archive/ ← ending in / = drop it INTO that folder
$ ls archive
site-backup
Phần 2 · lệnh đau nhất

Vì sao rm đáng sợ

Trên server không có thùng rác. Lệnh bạn gõ là lời phán cuối cùng.

Không thùng rác, không undo

rm xóa dữ liệu ngay lập tức và vĩnh viễn. Không có nút 'khôi phục'.

rm -r = cả thư mục

Với -r nó nuốt chửng cả thư mục và mọi thứ bên trong, đệ quy. Sai một ký tự khi đang ở xa nhà rất đắt.

Nghĩ trước khi gõ

Dừng lại, đọc to lệnh, kiểm tra đường dẫn. Ngón tay bạn nhanh hơn phán đoán của bạn.

rm -i — lưới an toàn

Cờ -i buộc rm hỏi 'chắc không?' trước mỗi lần xóa. Một thói quen rất tốt khi đang học.

03
Phần 3

Đọc nội dung & log

Công việc hằng ngày của terminal: nhìn vào trong file và xem các chương trình viết log.

Phần 3 · bộ công cụ đọc

Sáu động từ để đọc

Tên lệnh chính là mẹo nhớ: head và tail là hai đầu của file. cat cho file nhỏ, tail cho cái mới, grep để tìm.

LệnhVì sao có tên đó — và nó cho bạn gì
cat file'concatenate' (gộp lại) — in ra cả file, từ đầu đến cuối. Cho file ngắn.
head file'đầu' của file — 10 dòng đầu. File này bắt đầu bằng gì?
tail file'đuôi' của file — 10 dòng cuối, nơi nội dung mới nhất.
tail -f fileChế độ trực tiếp: in dòng mới khi chúng xuất hiện. Đây là cách bạn xem log.
grep err fileTìm kiếm — giữ lại chỉ những dòng chứa 'err'. Từ 'get regular expression'.
less file'less' (ít hơn) — lật trang file lớn bằng phím mũi tên; q để thoát.
Phần 3 · xem trực tiếp

tail -f: xem log 'thở'

Siêu năng lực của người ship: mở tail -f lên một log và mọi dòng mới hiện ra ngay lúc được ghi. Ctrl-C để dừng.

ops@vps — zsh
$ tail -f /var/log/nginx/access.log
10.0.0.5 - - "GET / HTTP/1.1" 200
10.0.0.5 - - "GET /style.css" 200
← lines appear as they happen — no refresh needed
10.0.0.5 - - "POST /login" 500
^C ← Ctrl-C stops the watch
Phần 3 · săn lỗi

tail -20 và grep: tìm những dòng xấu

Khi có thứ hỏng, bạn không đọc 10.000 dòng — bạn lấy 20 dòng cuối, rồi grep những dòng đáng đau.

ops@vps — zsh
$ tail -20 /var/log/nginx/access.log ← last 20 lines only
10.0.0.5 - - "GET /" 200
10.0.0.7 - - "GET /api/users" 200
10.0.0.5 - - "POST /login" 500
10.0.0.7 - - "GET /static/app.js" 200
$ grep 500 /var/log/nginx/access.log ← keep only the broken ones
10.0.0.5 - - "POST /login" 500
← from thousands of lines to the one that matters
Phần 3 · ghép lại

Vòng lặp gỡ lỗi 4 bước của người ship

Gần như mọi 'hỏng rồi' trong khóa học này đều được giải bằng đúng vòng lặp này.

  1. 1

    Quan sát

    tail -f lên log trước khi thay đổi gì. Xem ứng dụng thực sự đang làm gì.

  2. 2

    Hiện lại lỗi

    Kích hoạt lỗi (bấm nút, gửi request) và xem dòng log hiện ra trực tiếp.

  3. 3

    Săn

    Ctrl-C, rồi grep log tìm lỗi: grep 500 access.log. Cô lập những dòng xấu.

  4. 4

    Sửa & xác minh

    Sửa code (AI giúp), khởi động lại, tail -f lần nữa — 500 biến mất, 200 vào liên tục.

04
Phần 4

Pipe & chuyển hướng

Chỉ cần mô hình tư duy: output của một lệnh chảy vào lệnh kế tiếp — hoặc vào một file.

Phần 4 · mô hình tư duy

Bốn ký tự, một ý tưởng: dòng chảy

Một ý duy nhất: mọi lệnh đều in ra text, và bốn ký tự này lái text đến chỗ hữu dụng. Xem nó xảy ra ở những slide tiếp theo.

| — ống dẫn

cmd1 | cmd2 — output của cmd1 thành input của cmd2. Mẫu dùng hằng ngày: cat file | grep word.

> — ghi vào file

ls > out.txt — bắt output vào file (ghi đè phần cũ).

>> — nối thêm

ls >> out.txt — thêm vào cuối mà không xóa. Log lớn lên nhờ nó.

2> — phần lỗi

Lệnh in lỗi qua một kênh riêng. 2> err.log bắt riêng phần lỗi vào file.

Phần 4 · xem nó chảy

Pipe hoạt động thế nào

Mỗi lệnh đều in ra text; | đưa text đó cho lệnh kế tiếp. Mẫu kinh điển: cat file | grep word.

ops@vps — zsh
$ ls
app.py main.py notes.txt
$ ls | grep .py ← ls prints the list; grep keeps only lines with '.py'
app.py main.py
$ cat config.yml | grep port ← THE pattern: print the file, keep the matches
port: 8000
← same pattern, any source: swap cat for ls, or any command that prints
Phần 4 · vì sao có pipe

Hai bước hay một dòng?

Trước khi có pipe, nối chuỗi nghĩa là phải loay hoay với các file tạm. Pipe xóa bỏ bước trung gian.

ops@vps — zsh
$ cat access.log > big.txt ← the long way: dump to a temp file
$ grep 500 big.txt > errors.txt
$ rm big.txt ← and clean up
$ cat access.log | grep 500 > errors.txt ← one line, no temp file
← the pipe passes the text in memory — nothing touches disk
Phần 4 · nối dài tùy ý

Chuỗi: công cụ nhỏ, câu trả lời lớn

Mỗi pipe đưa text cho lệnh kế tiếp. Ba công cụ xếp hàng, bạn đã viết một truy vấn — không cần lập trình.

ops@vps — zsh
$ ls
app.py main.py notes.txt README.md
$ ls | grep .py ← step 1: only the python files
app.py main.py
$ ls | grep .py | wc -l ← step 2: and how many is that?
2
← wc -l counts lines — each file was exactly one line
Phần 4 · đưa nó đi nơi khác

> và >>: output thành file

Mũi tên chỉ nơi text đi: > ghi (và ghi đè), >> nối thêm, 2> bắt kênh lỗi.

ops@vps — zsh
$ ls > files.txt ← write the list into a file (overwrites)
$ cat files.txt ← prove it landed
app.py main.py notes.txt
$ echo "retry 1" >> log.txt ← >> appends; it does not erase
$ echo "retry 2" >> log.txt
$ cat log.txt
retry 1
retry 2
$ ls /nope 2> err.txt ← the error text goes to its own file
$ cat err.txt
ls: cannot access '/nope': No such file or directory
05
Phần 5

Toàn cảnh

Cỗ máy vận động dưới ngón tay bạn thế nào — và cửa sổ này đưa bạn đi đâu trong phần còn lại của khóa học.

Phần 5 · cỗ máy

Điều gì thực sự xảy ra khi bạn nhấn Enter

30 giây để xem qua cỗ máy đằng sau mỗi lệnh.

Lệnh của bạn là một chương trình

ls, git, docker — mỗi thứ là một file thực thi nhỏ nằm đâu đó trên đĩa. Bạn chỉ đang nhờ hệ điều hành chạy nó.

PATH tìm nó cho bạn

Danh sách các thư mục mà shell đi tìm. Đó là lý do bạn gõ git thay vì /usr/bin/git — ở bất cứ đâu.

Hai kênh output

stdout = kết quả, stderr = lỗi. Đó chính là lý do 2> tồn tại — bạn có thể chỉ bắt riêng phần lỗi.

0 = thành công

Mỗi lệnh kết thúc bằng một mã thoát: 0 = ổn, khác 0 = lỗi. Bạn (và script) kiểm tra nó.

Toàn cảnh

Terminal là điều khiển từ xa của hệ điều hành

Không có cánh cửa thứ hai vào máy. Mọi 'công cụ' bạn sẽ dùng đều chỉ là một lệnh chạy trong cửa sổ này.

git, docker, nginx…

…đều chỉ là lệnh trong terminal của bạn. Cùng cửa sổ, cùng prompt, cùng nhịp một dòng mỗi lần.

Khóa học xây trên nền này

Mỗi ngày sau — container, web server, HTTPS — là bạn gõ vài dòng ở đây và đọc kết quả.

AI viết, bạn chạy & đọc

Bạn sẽ dán lệnh do AI đưa. Kỹ năng là biết mỗi dòng để làm gì — và nhận ra khi output nói dối.

Output là sự thật

Terminal không giấu việc nó làm: nó in ra chuyện gì đã xảy ra. Biết đọc nó, không gì làm bạn ngạc nhiên.

Toàn cảnh · bản đồ khóa học

Những lệnh sẽ chở cả khóa học

Bạn sẽ gặp những lệnh này trong những ngày tới — tất cả đều chỉ là lệnh trong cùng cửa sổ này.

LệnhVai trò trong khóa học
docker compose up -dKhởi động cả stack (app, database…) thành container.
nginx -tKiểm tra cấu hình hợp lệ trước khi reload.
git pullLấy code mới nhất từ repo.
curl http://localhost/Hỏi chính server của bạn một trang — cách thử 'nó còn sống không?' nhanh nhất.
systemctl status nginxDịch vụ có đang chạy không? Từ khi nào? Đang làm gì?

pwd. cd. ls. Đó là cánh cửa.

Mở một terminal, gõ pwd, và bắt đầu đi. Mọi công cụ trong khóa học này đều sống trong cửa sổ đó.