hoatranlab.io.vn Zalo: 0917516878 Hotline: 0917516878 [email protected]
HoaTranLab Logo HoaTranLab
Linux Bible 11th Edition • Chapter 3

Using the Shell

Làm chủ Bash shell – nền tảng tương tác với Linux: chạy lệnh, dùng biến, alias, piping, redirection và các kỹ thuật nâng cao.

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]$

Terminal – Kiểm tra shell mặc định

$ 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.

Terminal – Options và Arguments

$ 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ử.

Terminal – History và Keyboard Shortcuts

$ 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ệuChức năngVí 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ừ filewc -l < file.txt
2>Chuyển hướng stderrcmd 2> err.txt
&>Chuyển hướng cả stdout và stderrcmd &> all.txt
|Pipe stdout sang lệnh tiếp theols | grep txt
Terminal – Piping và Redirection

$ 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.

Terminal – Shell Variables

$ 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.

Terminal – Alias

$ 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ĩaVí 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ặcls [abc]*.sh
[a-z]Khớp với ký tự trong phạm vils [a-z]*
{a,b,c}Brace expansion – tạo nhiều giá trịmkdir {2024,2025}/{Jan,Feb}
Terminal – Command Types và Builtin

$ 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ế.

1

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.

Terminal

$ 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)

2

Thực hành Redirection

Ghi output ra file, đọc từ file, và dùng /dev/null.

Terminal

$ 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

3

Pipeline phức tạp

Kết hợp nhiều lệnh qua pipe để xử lý dữ liệu.

Terminal

$ 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]

4

Tạo Alias và Lưu vào .bashrc

Tạo các alias hữu ích và lưu để dùng lại.

Terminal

$ 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

5

Sử dụng Wildcards

Thực hành dùng wildcards để liệt kê và thao tác file.

Terminal

$ 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

6

Command History và Shortcuts

Sử dụng history để tái sử dụng lệnh hiệu quả.

Terminal

$ 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

1

Sự khác nhau giữa shell builtin và external command là gì? Cho ví dụ.

Shell builtin (như 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.
2

Giải thích sự khác nhau giữa >>> 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.
3

Tại sao biến PATH quan trọng? Làm thế nào để thêm thư mục mới vào PATH?

PATH xác định các thư mục shell sẽ tìm kiếm khi bạn gõ tên lệnh. Không có PATH, bạn phải gõ đường dẫn đầy đủ. Thêm thư mục: export PATH=$PATH:/opt/myapp/bin. Để vĩnh viễn, thêm vào ~/.bashrc hoặc /etc/profile.d/.
4

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.
5

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.
6

Sự khác nhau giữa single quote ('') và double quote ("") trong Bash là gì?

Single quote giữ nguyên ký tự, không mở rộng biến hay command substitution. Double quote cho phép mở rộng biến ($VAR), command substitution ($(cmd)), nhưng giữ các ký tự đặc biệt khác như * và ?. Ví dụ: echo '$HOME' → $HOME; echo "$HOME" → /home/chris.
7

Làm thế nào để alias được lưu lại sau khi khởi động lại terminal?

Alias tạo bằng lệnh 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.
8

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.
9

Ký tự wildcard nào khớp đúng 1 ký tự? Cho ví dụ thực tế.

Ký 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.
10

Phân biệt stdin (0), stdout (1), stderr (2). Khi nào dùng 2>&1?

stdin (fd 0): input từ bàn phím hoặc file. stdout (fd 1): output thông thường. stderr (fd 2): thông báo lỗi. 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.