Mục Tiêu Chương 3
Hiểu về Shell
Phân biệt các loại shell (bash, sh, ksh, zsh), biết cách chọn shell và xem shell mặc định trong /etc/passwd.
Chạy lệnh cơ bản
Sử dụng options, arguments, tab completion, command history, và các phím tắt Bash để làm việc hiệu quả.
Piping & Redirection
Kết hợp lệnh với pipe (|), chuyển hướng stdout (> >>), stderr (2>), stdin (<) và /dev/null.
Biến Shell & Môi trường
Khai báo biến, export biến môi trường, hiểu PATH, HOME, USER, PS1 và các biến đặc biệt khác.
Alias & Functions
Tạo alias rút gọn lệnh dài, viết hàm shell, và lưu alias vào ~/.bashrc để dùng lại mỗi lần đăng nhập.
Wildcards & Expansion
Dùng ký tự đại diện (* ? []), brace expansion {}, command substitution $() và arithmetic expansion $(( )).
Lý Thuyết: Shell Fundamentals
1. Shell Prompt và các loại Shell
Shell là giao diện dòng lệnh để tương tác với Linux kernel. Bash (Bourne Again Shell) là shell mặc định trên hầu hết các bản phân phối Linux. Prompt $ cho user thường, # cho root. Dạng đầy đủ: [username@hostname dir]$
$ whoami
chris
$ grep chris /etc/passwd
chris:x:1001:1001::/home/chris:/bin/bash
$ echo $SHELL
/bin/bash
$ bash --version
GNU bash, version 5.2.21(1)-release
2. Chạy Lệnh – Options và Arguments
Lệnh có dạng: command [options] [arguments]. Options một ký tự dùng -, options từ đầy đủ dùng --. Có thể gom nhiều single-letter options lại.
$ ls -l -a -t
# Tương đương với:
$ ls -lat
total 48
drwxr-xr-x. 15 chris chris 4096 Jun 13 08:14 .
$ date --help
Usage: date [OPTION]... [+FORMAT]
$ hostname --help
Usage: hostname [-b] {hostname|-F file} set host name (from file)
3. Tab Completion và Command History
Tab completion tự động hoàn thành tên lệnh, file, thư mục. Command history lưu lịch sử lệnh trong ~/.bash_history. Dùng Ctrl+R để tìm kiếm lịch sử.
$ history
1 date
2 ls -la
3 pwd
$ !2
# Chạy lại lệnh số 2 trong history
$ !!
# Chạy lại lệnh cuối cùng
$ !ls
# Chạy lại lệnh cuối bắt đầu bằng "ls"
# Ctrl+R: tìm kiếm ngược trong history
# Ctrl+C: hủy lệnh đang chạy
# Ctrl+L: xóa màn hình (clear)
# Ctrl+A: về đầu dòng | Ctrl+E: về cuối dòng
4. Piping và Redirection
Piping (|) kết nối stdout của lệnh này vào stdin của lệnh tiếp theo. Redirection cho phép chuyển hướng input/output đến file hoặc thiết bị.
| Ký hiệu | Chức năng | Ví dụ |
|---|---|---|
| > | Ghi stdout vào file (ghi đè) | ls > files.txt |
| >> | Ghi stdout vào file (nối tiếp) | date >> log.txt |
| < | Đọc stdin từ file | wc -l < file.txt |
| 2> | Chuyển hướng stderr | cmd 2> err.txt |
| &> | Chuyển hướng cả stdout và stderr | cmd &> all.txt |
| | | Pipe stdout sang lệnh tiếp theo | ls | grep txt |
$ ls /etc | grep conf | head -5
adduser.conf
debconf.conf
idmapd.conf
$ cat /etc/passwd | wc -l
42
$ ls /nonexistent 2> /dev/null
# Không hiện thị lỗi (đưa stderr vào /dev/null)
$ ls -la > listing.txt 2>&1
# Ghi cả stdout và stderr vào file
Biến Shell, Alias và Wildcards
5. Biến Shell và Môi trường
Biến shell lưu giá trị trong shell hiện tại. Biến môi trường (environment variables) được export để các tiến trình con kế thừa. Biến quan trọng: PATH, HOME, USER, PS1.
$ MYVAR="Hello Linux"
$ echo $MYVAR
Hello Linux
$ export MYVAR
# Biến giờ được kế thừa bởi tiến trình con
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/home/chris/bin
$ PATH=$PATH:/opt/myapp/bin
# Thêm thư mục vào PATH
$ env | grep HOME
HOME=/home/chris
$ PS1="[\u@\h \W]\$ "
# Thay đổi dạng hiển thị prompt
6. Alias và Functions
Alias tạo tên rút gọn cho lệnh dài. Lưu alias vào ~/.bashrc để dùng lại sau khi restart.
$ alias ll='ls -la'
$ alias grep='grep --color=auto'
$ alias ..='cd ..'
$ alias update='sudo dnf update -y'
$ alias
alias ll='ls -la'
alias grep='grep --color=auto'
$ unalias ll
# Xóa alias
# Thêm vào ~/.bashrc để lưu vĩnh viễn:
$ echo "alias ll='ls -la'" >> ~/.bashrc
$ source ~/.bashrc
7. Wildcards và Globbing
Wildcards mở rộng pattern thành danh sách file thực sự trên hệ thống.
| Wildcard | Ý nghĩa | Ví dụ |
|---|---|---|
| * | Khớp với bất kỳ chuỗi ký tự nào (kể cả rỗng) | ls *.txt |
| ? | Khớp với đúng 1 ký tự bất kỳ | ls file?.txt |
| [abc] | Khớp với 1 trong các ký tự trong ngoặc | ls [abc]*.sh |
| [a-z] | Khớp với ký tự trong phạm vi | ls [a-z]* |
| {a,b,c} | Brace expansion – tạo nhiều giá trị | mkdir {2024,2025}/{Jan,Feb} |
$ type cd
cd is a shell builtin
$ type ls
ls is /usr/bin/ls
$ type ll
ll is aliased to 'ls -la'
$ which python3
/usr/bin/python3
$ $(date +%Y)
# Command substitution – chèn output vào lệnh khác
$ echo "Today: $(date)"
Today: Fri Jun 13 08:14:53 EDT 2025
Lab Thực Hành – Chapter 3
Thực hành các kỹ năng shell cơ bản và nâng cao trong môi trường Linux thực tế.
Kiểm tra Shell và Đăng nhập
Xác nhận shell đang dùng và tìm hiểu thông tin user hiện tại.
$ echo $SHELL
/bin/bash
$ bash --version
GNU bash, version 5.2.21(1)-release
$ whoami && id
chris
uid=1001(chris) gid=1001(chris) groups=1001(chris),10(wheel)
Thực hành Redirection
Ghi output ra file, đọc từ file, và dùng /dev/null.
$ ls /etc > /tmp/etc_list.txt
$ wc -l /tmp/etc_list.txt
198 /tmp/etc_list.txt
$ date >> /tmp/etc_list.txt
$ ls /nonexistent 2> /tmp/errors.txt
$ cat /tmp/errors.txt
ls: cannot access '/nonexistent': No such file or directory
Pipeline phức tạp
Kết hợp nhiều lệnh qua pipe để xử lý dữ liệu.
$ cat /etc/passwd | cut -d: -f1 | sort | head -10
adm
bin
chris
$ ps aux | grep ssh | grep -v grep
root 1234 0.0 0.1 sshd: /usr/sbin/sshd -D [listener]
Tạo Alias và Lưu vào .bashrc
Tạo các alias hữu ích và lưu để dùng lại.
$ cat >> ~/.bashrc << 'EOF'
alias ll='ls -la'
alias ..='cd ..'
alias myip='curl -s ifconfig.me'
alias now='date "+%Y-%m-%d %H:%M:%S"'
EOF
$ source ~/.bashrc
$ ll /home
total 8
drwxr-xr-x. 1 chris chris 4096 Jun 13 08:00 chris
Sử dụng Wildcards
Thực hành dùng wildcards để liệt kê và thao tác file.
$ ls /etc/*.conf | wc -l
47
$ ls /etc/[ab]*.conf
/etc/asound.conf /etc/brltty.conf
$ mkdir -p /tmp/test/{jan,feb,mar}/{logs,data}
$ ls /tmp/test/jan/
data logs
Command History và Shortcuts
Sử dụng history để tái sử dụng lệnh hiệu quả.
$ history | tail -20
$ history | grep "ls"
$ !50
# Chạy lại lệnh số 50
$ HISTSIZE=5000
$ HISTFILESIZE=10000
$ export HISTCONTROL=ignoredups
# Không lưu lệnh trùng lặp liên tiếp
Câu Hỏi Ôn Tập – Chapter 3
Sự khác nhau giữa shell builtin và external command là gì? Cho ví dụ.
cd, echo, pwd) được tích hợp sẵn vào shell, không cần file thực thi riêng. External command (như /usr/bin/ls, /bin/grep) là các file thực thi độc lập. Dùng type command để kiểm tra loại lệnh.
Giải thích sự khác nhau giữa > và >> trong redirection.
> ghi đè nội dung file (file cũ bị xóa và tạo lại). >> nối thêm nội dung vào cuối file hiện có mà không xóa dữ liệu cũ. Ví dụ: echo "log" >> /var/log/myapp.log an toàn hơn khi dùng log files.
Tại sao biến PATH quan trọng? Làm thế nào để thêm thư mục mới vào PATH?
export PATH=$PATH:/opt/myapp/bin. Để vĩnh viễn, thêm vào ~/.bashrc hoặc /etc/profile.d/.
Lệnh nào cho phép bạn chạy lại lệnh vừa thực thi? Và lệnh thứ 42 trong history?
!! chạy lại lệnh cuối cùng. !42 chạy lại lệnh số 42 trong history. !ls chạy lại lệnh cuối cùng bắt đầu bằng "ls". Ctrl+R để tìm kiếm ngược trong history một cách tương tác.
Viết lệnh đếm số file .conf trong /etc mà không hiện thị lỗi.
ls /etc/*.conf 2>/dev/null | wc -l. Hoặc dùng find: find /etc -name "*.conf" 2>/dev/null | wc -l. 2>/dev/null chuyển stderr (thông báo lỗi) vào /dev/null (thiết bị hủy dữ liệu), chỉ giữ lại stdout.
Sự khác nhau giữa single quote ('') và double quote ("") trong Bash là gì?
echo '$HOME' → $HOME; echo "$HOME" → /home/chris.
Làm thế nào để alias được lưu lại sau khi khởi động lại terminal?
alias chỉ tồn tại trong session hiện tại. Để lưu vĩnh viễn, thêm vào ~/.bashrc (cho user hiện tại) hoặc /etc/bashrc (cho tất cả users). Sau khi thêm, chạy source ~/.bashrc để áp dụng ngay.
Viết pipeline để hiện thị 5 process đang dùng nhiều CPU nhất.
ps aux --sort=-%cpu | head -6 (bao gồm header). Hoặc: ps aux | sort -rk 3 | head -6 (sắp xếp theo cột 3 là %CPU, theo thứ tự giảm dần). Pipe kết nối stdout của ps vào stdin của sort, rồi sang head.
Ký tự wildcard nào khớp đúng 1 ký tự? Cho ví dụ thực tế.
? khớp đúng 1 ký tự bất kỳ. Ví dụ: ls file?.txt sẽ khớp với file1.txt, fileA.txt nhưng không khớp với file10.txt. Ký tự * khớp với 0 hoặc nhiều ký tự. [abc] khớp với 1 ký tự trong tập hợp.
Phân biệt stdin (0), stdout (1), stderr (2). Khi nào dùng 2>&1?
2>&1 chuyển hướng stderr vào cùng chỗ với stdout. Dùng khi muốn ghi cả output và error vào cùng file: command > output.txt 2>&1.