This programming guide is only available in Vietnamese. Switch to Vietnamese to read the full article.

Bài đầu tiên trong series Bash & Shell Scripting sẽ giúp bạn hiểu rõ môi trường dòng lệnh (command line) — nền tảng cốt lõi trước khi viết bất kỳ shell script nào. Chúng ta sẽ tìm hiểu sự khác biệt giữa Terminal, Shell và Console, cách điều hướng filesystem, quản lý file và hệ thống phân quyền Unix.

1. Terminal là gì? Shell vs Terminal vs Console

Nhiều người hay nhầm lẫn giữa ba khái niệm này:

  • Terminal Emulator: Là ứng dụng đồ họa (GUI) cung cấp cửa sổ để bạn tương tác với shell. Ví dụ: iTerm2 (macOS), GNOME Terminal (Linux), Windows Terminal.
  • Shell: Là chương trình thông dịch lệnh (command interpreter) chạy bên trong terminal. Shell nhận lệnh của bạn, phân tích cú pháp và gọi hệ điều hành thực thi. Các shell phổ biến: bash, zsh, fish, sh.
  • Console: Thuật ngữ lịch sử chỉ thiết bị vật lý kết nối trực tiếp với máy tính (physical terminal). Ngày nay thường dùng thay thế cho terminal.

Nói đơn giản: bạn mở Terminal (ứng dụng), Terminal chạy Shell (bash/zsh), và bạn gõ lệnh vào Shell để điều khiển máy tính.

terminal_basics.sh
# Kiểm tra shell hiện tại
echo $SHELL          # /bin/bash hoặc /bin/zsh
echo $BASH_VERSION   # 5.2.15(1)-release

# Liệt kê tất cả shell có sẵn trên hệ thống
cat /etc/shells

# Chuyển đổi shell tạm thời
bash    # chuyển sang bash
zsh     # chuyển sang zsh
exit    # thoát shell hiện tại, quay về shell trước

2. Cấu trúc lệnh Unix

Mọi lệnh trong Unix/Linux đều tuân theo cấu trúc chung:

command_structure.sh
# Cấu trúc: command [options] [arguments]
ls -la /home

# command = ls (liệt kê nội dung thư mục)
# options = -la (-l: dạng danh sách dài, -a: hiện file ẩn)
# argument = /home (thư mục cần liệt kê)

# Short options (viết tắt 1 ký tự, dùng dấu -)
ls -l -a -h       # tách riêng
ls -lah            # gộp lại (tương đương)

# Long options (viết đầy đủ, dùng --)
ls --all --human-readable

# Đọc hướng dẫn lệnh
man ls             # manual page đầy đủ
ls --help          # trợ giúp ngắn gọn
type ls            # kiểm tra lệnh là built-in hay external

3. Điều hướng Filesystem

Hệ thống file Unix được tổ chức dạng cây thư mục bắt đầu từ thư mục gốc / (root). Các thư mục quan trọng:

  • / — Thư mục gốc (root directory)
  • /home — Thư mục chứa dữ liệu người dùng (Linux), macOS dùng /Users
  • /etc — File cấu hình hệ thống
  • /var — Dữ liệu thay đổi: logs, cache, spool
  • /tmp — File tạm thời (tự xóa khi reboot)
  • /usr/bin — Chương trình người dùng (user binaries)
navigation.sh
# In thư mục hiện tại
pwd                  # /home/user (Print Working Directory)

# Di chuyển thư mục
cd /etc              # đường dẫn tuyệt đối (absolute path)
cd Documents         # đường dẫn tương đối (relative path)
cd ~                 # về thư mục home ($HOME)
cd -                 # quay lại thư mục trước đó
cd ..                # lên thư mục cha
cd ../..             # lên 2 cấp thư mục cha

# Liệt kê nội dung
ls                   # danh sách cơ bản
ls -l                # dạng dài (permissions, owner, size, date)
ls -a                # hiện file ẩn (bắt đầu bằng dấu .)
ls -lh               # -l + human-readable size (KB, MB, GB)
ls -R                # đệ quy (liệt kê cả thư mục con)
ls -lt               # sắp xếp theo thời gian sửa đổi

# Cây thư mục (cần cài đặt: brew install tree / apt install tree)
tree -L 2            # hiển thị cây thư mục, sâu 2 cấp
tree -d              # chỉ hiện thư mục (không hiện file)

4. Quản lý File & Thư mục

file_management.sh
# Tạo thư mục
mkdir projects                    # tạo 1 thư mục
mkdir -p projects/web/src/css     # tạo nested (tự tạo thư mục cha nếu chưa có)

# Tạo file rỗng / cập nhật timestamp
touch index.html
touch file1.txt file2.txt file3.txt   # tạo nhiều file cùng lúc

# Sao chép
cp file1.txt backup.txt          # copy file
cp -r projects/ projects_backup/  # copy thư mục (recursive)
cp -i file1.txt file2.txt         # hỏi xác nhận trước khi ghi đè (-i = interactive)

# Di chuyển & đổi tên
mv old_name.txt new_name.txt     # đổi tên file
mv file1.txt Documents/          # di chuyển file vào thư mục
mv *.txt archive/                # di chuyển nhiều file theo pattern

# Xóa — CẨN THẬN! Không có thùng rác (Trash)
rm file1.txt                     # xóa file
rm -r old_folder/                # xóa thư mục và nội dung bên trong
rm -f stubborn_file.txt          # xóa không hỏi (force)
rm -rf temp/                     # xóa thư mục force + recursive
# ⚠️ CẢNH BÁO: KHÔNG BAO GIỜ chạy rm -rf / hoặc rm -rf ~

# Liên kết (Links)
ln file.txt hardlink.txt         # Hard link (cùng inode, cùng dữ liệu)
ln -s /path/to/file symlink.txt  # Symbolic link (shortcut, trỏ đến path)
ls -l symlink.txt                # hiện -> /path/to/file

5. Phân quyền & Ownership

Mỗi file/thư mục trong Unix có 3 nhóm quyền: Owner (chủ sở hữu), Group (nhóm), Others (người khác). Mỗi nhóm có 3 quyền: r (read - đọc), w (write - ghi), x (execute - thực thi).

permissions.sh
# Đọc output ls -l:
# -rwxr-xr-- 1 user group 4096 Jun 24 10:00 script.sh
# │├─┤├─┤├─┤
# │ │   │  └── Others: r-- (chỉ đọc = 4)
# │ │   └───── Group:  r-x (đọc + thực thi = 5)
# │ └───────── Owner:  rwx (đọc + ghi + thực thi = 7)
# └──────────── Loại: - (file), d (directory), l (symlink)

# chmod — thay đổi quyền
chmod 755 script.sh              # Owner=rwx(7), Group=r-x(5), Others=r-x(5)
chmod 644 readme.txt             # Owner=rw-(6), Group=r--(4), Others=r--(4)
chmod u+x script.sh              # thêm quyền execute cho Owner (symbolic)
chmod g-w file.txt               # bỏ quyền write cho Group
chmod a+r public.txt             # thêm quyền read cho All (owner+group+others)
chmod -R 755 my_project/         # áp dụng đệ quy cho cả thư mục

# chown — thay đổi chủ sở hữu
sudo chown newuser file.txt              # đổi owner
sudo chown newuser:newgroup file.txt     # đổi owner và group
sudo chown -R www-data:www-data /var/www # đệ quy

# chgrp — thay đổi nhóm
sudo chgrp developers project/

# Quyền đặc biệt
chmod u+s program     # SUID: chạy với quyền owner (ví dụ: passwd)
chmod g+s shared_dir/ # SGID: file mới trong thư mục kế thừa group
chmod +t /tmp         # Sticky bit: chỉ owner mới được xóa file của mình

# sudo — chạy lệnh với quyền superuser (root)
sudo apt update       # ví dụ: cập nhật package list trên Ubuntu
whoami                # kiểm tra user hiện tại
sudo whoami           # root

6. Câu hỏi trắc nghiệm ôn tập

Trắc nghiệm 1: Quyền truy cập file

File có quyền chmod 640. Người dùng thuộc nhóm "others" có thể làm gì với file này?

Trắc nghiệm 2: Điều hướng thư mục

Bạn đang ở /home/user/projects/web. Chạy cd ../../Documents sẽ đưa bạn đến đâu?

Trắc nghiệm 3: Hard link vs Symbolic link

Nếu bạn xóa file gốc, điều gì xảy ra với hard link và symbolic link trỏ đến file đó?

Tải file code thực hành minh họa bài học

File script tổng hợp các lệnh cơ bản terminal, điều hướng filesystem và quản lý phân quyền:

Tải về terminal_basics.sh

Related Articles

Bài viết liên quan trong series

Lesson 2: Variables, Strings & Arrays: Parameter Expansion & Arithmetic Bài 2: Biến, Chuỗi & Mảng — Parameter Expansion & Arithmetic Back to Bash Series Overview Quay lại Lộ trình Bash Series