
Thực hành tổng hợp Linux Essentials: dữ liệu, script và quyền
Thực hành Linux với ticket giả lập: tạo script đếm, kiểm tra lỗi, giới hạn dữ liệu, phục hồi TAR và xác minh báo cáo HTTP loopback bằng so sánh byte.

Hiểu Bash phân tích dòng lệnh: dấu nháy, biến, export, word splitting và PATH; thực hành dự đoán đối số bằng các ví dụ có kết quả kiểm chứng.
Bạn nhận một tệp tên Bao cao.txt và nhập tên đó sau một lệnh. Chương trình lại báo thiếu tệp Bao. Vấn đề có thể xảy ra trước khi chương trình đọc dữ liệu: shell đã chia phần bạn nhập thành nhiều đối số. Hiểu ranh giới này giúp bạn giải thích lỗi, thay vì thử thêm quyền quản trị hoặc đổi tên mọi tệp gặp trong công việc.
Bài đối chiếu mục tiêu 2.1 của PDF 010-160, trang in 72–97, trang PDF vật lý 81–106; phần hiện hành liên hệ mục tiêu 012.1 của 010-200. Mốc biên tập: 23/10/2026. Sau bài, bạn sẽ phân biệt terminal, shell và chương trình; dự đoán đối số; dùng biến cùng dấu nháy phù hợp. Phần lab dùng Bash và dữ liệu tự tạo, không cần sudo.
Terminal cung cấp bề mặt nhập và hiển thị. Bash là shell đọc dòng lệnh rồi thực hiện các bước phân tích, mở rộng và gọi chương trình. Một số lệnh là builtin do shell thực hiện; một số khác là executable được tìm qua PATH hoặc một đường dẫn chỉ định. Nhìn một cửa sổ chữ không đủ để kết luận bên trong đang chạy Bash hay đang thao tác đúng máy.
Mở Bash trong guest Linux đã chuẩn bị, rồi kiểm tra phiên bản và cách tên lệnh được giải quyết. Biến SHELL thường mô tả login shell; nó không chứng minh chương trình đang thực thi câu lệnh hiện tại. Nếu host dùng zsh, đừng gán hành vi của zsh cho bài Bash.
bash
printf '%s\n' "$BASH_VERSION"
type cd
type printf
type ls
Trong một môi trường Bash thông thường, cd là builtin vì nó cần đổi thư mục của chính shell. printf có thể có builtin và bản executable; type chỉ ra cách tên được giải quyết tại thời điểm hỏi. Alias, function hoặc PATH có thể thay đổi kết quả. Vì vậy khi một lệnh hành xử lạ, kiểm tra type trước khi kết luận bản thân chương trình bị lỗi.
Trong cách dùng đơn giản, phần đầu là tên lệnh; các phần tiếp theo cung cấp tùy chọn và dữ liệu. Tuy nhiên, dấu cách bạn nhìn thấy trong văn bản không luôn đồng nghĩa với một ranh giới đối số. Dấu nháy có thể gom nhiều ký tự thành một phần, còn mở rộng biến không có dấu nháy có thể làm một phần trở thành nhiều phần.
Phép thử dưới dùng printf để nhìn ranh giới trực tiếp. Chuỗi định dạng được giữ cố định, mỗi đối số dữ liệu được in trong một cặp dấu ngoặc vuông. Nó không tạo hoặc xóa tệp.
printf '[%s]\n' Bao cao.txt
printf '[%s]\n' 'Bao cao.txt'
Dòng đầu dự kiến in hai dòng: [Bao] và [cao.txt]. Dòng sau in một dòng [Bao cao.txt]. Chương trình nhận những đối số khác nhau dù bạn định nói đến cùng một tên. Các dấu nháy dùng để phân tích cú pháp không tự trở thành ký tự trong tên tệp được truyền đi.
Đừng tự xây chuỗi lệnh bằng cách nối dữ liệu người dùng rồi chạy eval. Khi đó dữ liệu có thể bị phân tích như mã ở một vòng khác. Bài nhập môn chỉ cần một nguyên tắc: giữ lệnh và dữ liệu tách biệt; dùng quoting để bảo toàn giá trị, không dùng nó như lời bảo đảm cho mọi rủi ro bên trong chương trình được gọi.

Nháy đơn giữ nội dung bên trong theo nghĩa chữ trong cách dùng thông thường của Bash; biến không được mở rộng bên trong nó. Nháy kép cho phép mở rộng biến và một số cơ chế khác nhưng bảo vệ kết quả khỏi word splitting và filename expansion. Dấu gạch chéo ngược có thể bảo vệ ký tự theo ngữ cảnh. Không xem ba cách này là thay thế giống hệt nhau.
learner='IT Help Desk'
printf '%s\n' '$learner'
printf '%s\n' "$learner"
printf '[%s]\n' IT\ Help\ Desk
Dòng dùng nháy đơn in chữ $learner. Dòng dùng nháy kép in IT Help Desk. Ở dòng cuối, các khoảng trắng được escape nên chương trình nhận một đối số. Với giá trị lấy từ biến, dùng nháy kép thường dễ đọc và ít sai hơn tự escape từng khoảng trắng.
Nháy kép không có nghĩa “không có bất kỳ xử lý nào”. Ví dụ, cơ chế command substitution vẫn có thể được thực hiện khi bạn viết nó trong mã shell. Quoting giúp kiểm soát cách shell xử lý dữ liệu; nó không thay kiểm tra tùy chọn nguy hiểm, đường dẫn đích hoặc quyền thực thi của chương trình. Xem Bash: Quoting để phân biệt các cơ chế theo đúng shell.
Gán biến trong Bash không đặt khoảng trắng quanh dấu bằng. learner=value là phép gán; learner = value có cách phân tích khác và có thể trở thành lời gọi một lệnh tên learner. Chọn tên biến riêng cho bài tập, không ghi đè HOME, PATH hoặc các biến hệ thống chỉ để thử.
lpi_note='Linux lab'
printf '%s\n' "$lpi_note"
bash -c 'printf "child=<%s>\n" "$lpi_note"'
export lpi_note
bash -c 'printf "child=<%s>\n" "$lpi_note"'
unset lpi_note
Trong phiên Bash sạch, shell con đầu tiên không nhận biến chưa export nên giá trị bên trong cặp ngoặc rỗng. Sau export, shell con nhận giá trị Linux lab. unset xóa biến khỏi shell hiện tại. Một biến môi trường được tiến trình con kế thừa; thay đổi trong tiến trình con không tự cập nhật ngược shell cha.
Không dùng bài tập export để lưu token hoặc mật khẩu thật. Biến môi trường có thể xuất hiện trong công cụ chẩn đoán hoặc bị chương trình con đọc. Mục tiêu ở đây là hiểu luồng kế thừa. Với một ứng dụng cụ thể, cơ chế quản lý bí mật phải được xem theo hệ thống triển khai của nó.
Word splitting tách kết quả mở rộng chưa được quote theo quy tắc IFS. Globbing mở rộng mẫu tên tệp như *.txt theo nội dung thư mục. Đây là hai cơ chế khác nhau. Trong script, một giá trị biến có khoảng trắng hoặc ký tự * có thể khiến số đối số đổi khi thiếu dấu nháy.
lpi_label='Bao cao'
printf '[%s]\n' $lpi_label
printf '[%s]\n' "$lpi_label"
Hai dòng dự kiến tạo hai đối số và một đối số tương ứng trong môi trường IFS mặc định. Đây là ví dụ có chủ ý về việc thiếu quoting, không phải mẫu nên sao chép vào script công việc. Với giá trị biến được dùng như một tên tệp, khởi đầu bằng cách bảo toàn nó thành một đối số.
Globbing phụ thuộc dữ liệu hiện có và tùy chọn shell. Nếu không có tên khớp, Bash mặc định có thể giữ nguyên mẫu; nullglob hoặc failglob sẽ đổi hành vi đó. Không dùng kết quả ở một thư mục rỗng để kết luận dấu * luôn là ký tự thường. Các bài thao tác tệp sau sẽ giải thích cách kiểm tra danh sách đích trước khi thay đổi dữ liệu.

PATH là danh sách các thư mục shell dùng để tìm lệnh theo tên trong những trường hợp phù hợp. Nó không phải danh sách mọi phần mềm được cài và cũng không chứng minh chương trình tìm thấy là an toàn. Khi tài liệu yêu cầu thêm thư mục tải về vào đầu PATH, bạn cần hiểu tên lệnh nào có thể bị thay thế.
printf '%s\n' "$PATH"
command -v bash
type -a printf
Các lệnh chỉ truy vấn, không sửa PATH. Nếu tên lệnh thiếu nhưng bạn biết đường dẫn tuyệt đối đến executable, đó là một hướng kiểm tra; đừng tải một tệp trùng tên bất kỳ từ Internet. Không đưa dấu chấm đại diện thư mục hiện tại lên đầu PATH như một cách sửa chung cho lỗi command not found.
Hãy đổi lpi_label thành một chuỗi ba từ và dự đoán số dòng trước khi chạy hai phép printf. Sau đó mở shell con trước và sau export một biến tự chọn. Ghi kết quả vào notes của lab bằng mô tả ngắn, không chụp toàn bộ môi trường nếu nó chứa dữ liệu riêng. Bạn cần giải thích tại sao kết quả khác nhau, không chỉ ghi “lệnh chạy được”.
Nếu nhận command not found, kiểm tra chính tả, shell và type/command -v. Nếu tên tệp bị tách, kiểm tra quoting và giá trị biến. Nếu một biến mất khi mở shell mới, kiểm tra phạm vi phiên và export. Không sửa ba loại lỗi này bằng sudo: quyền cao hơn không khôi phục ranh giới đối số hoặc tự truyền biến cho tiến trình cha.
Câu hỏi 1: Vì sao nháy kép quanh biến có khoảng trắng hữu ích? Nó giữ kết quả thành một đối số trong cách dùng này. Câu hỏi 2: export có làm biến tồn tại mãi sau đăng xuất không? Không; nó điều chỉnh môi trường kế thừa của phiên hiện tại. Cấu hình khởi tạo shell là chủ đề khác.
Câu hỏi 3: type cd và type ls nhất thiết cho cùng loại kết quả không? Không; cd thường là builtin, ls thường là executable nhưng alias hoặc function có thể ảnh hưởng. Bạn đạt bài khi dự đoán được đối số, phân biệt phạm vi biến và mô tả một phép kiểm tra phù hợp trước khi thực hiện thay đổi.

Thực hành Linux với ticket giả lập: tạo script đếm, kiểm tra lỗi, giới hạn dữ liệu, phục hồi TAR và xác minh báo cáo HTTP loopback bằng so sánh byte.

Hiểu thư mục tạm và tệp đặc biệt Linux; thử mktemp, sticky bit, hard link và symlink, kiểm tra đích sau di chuyển và phân biệt liên kết với backup.

Đọc quyền tệp Linux, owner và group; thử chmod, chown, search thư mục và umask bằng tài khoản không root, phân biệt ghi nội dung với xóa tên tệp.

Tạo người dùng Linux và nhóm trong lab riêng; kiểm tra home, skeleton, nhóm bổ sung, khóa mật khẩu và phạm vi xóa tài khoản trước khi áp dụng thực tế.