TopDev

Shell là gì? liệt kê top 100 câu hỏi về Shell

minhdev 📖 10 phút đọc

Chắc chắn rồi! Với vai trò là một chuyên gia lập trình và quản trị viên tại TopDev, tôi rất vui được chia sẻ kiến thức về Shell, một trong những công cụ mạnh mẽ và không thể thiếu đối với bất kỳ lập trình viên hay quản trị hệ thống nào.

Shell là gì?#

Shell (hay còn gọi là Command Line Interpreter - Trình thông dịch dòng lệnh) là một chương trình máy tính cung cấp giao diện người dùng để truy cập các dịch vụ của hệ điều hành. Nói một cách đơn giản, nó là lớp vỏ bọc bên ngoài của hệ điều hành (kernel), cho phép bạn giao tiếp với máy tính bằng cách gõ các lệnh văn bản.

Thay vì phải click chuột vào các biểu tượng đồ họa (như trong giao diện người dùng đồ họa - GUI), bạn sẽ gõ các câu lệnh vào Shell để thực hiện các tác vụ như:

  • Di chuyển giữa các thư mục

  • Tạo, xóa, sao chép, di chuyển tệp và thư mục

  • Chạy các chương trình

  • Quản lý tiến trình

  • Tự động hóa các tác vụ lặp đi lặp lại (thông qua Shell Scripting)

  • Quản lý quyền truy cập tệp

  • Giám sát hệ thống

Các loại Shell phổ biến:

  • Bash (Bourne-Again SHell): Là Shell mặc định trên hầu hết các hệ điều hành Linux và macOS. Nó là một trong những Shell được sử dụng rộng rãi nhất.

  • Zsh (Z Shell): Là một phiên bản mở rộng của Bash, cung cấp nhiều tính năng mạnh mẽ hơn như tự động hoàn thành nâng cao, tùy chỉnh theme, và plugin.

  • Sh (Bourne Shell): Shell gốc, đơn giản hơn Bash.

  • Csh (C Shell) / Tcsh: Các Shell có cú pháp gần giống ngôn ngữ C, thường được sử dụng trong môi trường UNIX.

  • Ksh (Korn Shell): Kết hợp các tính năng của Bourne Shell và C Shell.

Tại sao Shell lại quan trọng?#

  • Hiệu quả và tốc độ: Thực hiện các tác vụ nhanh hơn nhiều so với giao diện đồ họa, đặc biệt khi làm việc với nhiều tệp hoặc các tác vụ lặp lại.

  • Tự động hóa: Shell Scripting cho phép bạn viết các tập lệnh để tự động hóa các quy trình phức tạp, giúp tiết kiệm thời gian và giảm thiểu lỗi.

  • Quản trị hệ thống: Hầu hết các tác vụ quản trị máy chủ, cài đặt phần mềm, cấu hình mạng đều được thực hiện thông qua Shell.

  • Lập trình: Nhiều công cụ phát triển, hệ thống kiểm soát phiên bản (Git), trình biên dịch, và các tác vụ xây dựng dự án đều được sử dụng qua Shell.

  • Truy cập từ xa: Khi làm việc với máy chủ từ xa (ví dụ: qua SSH), Shell là phương tiện duy nhất để tương tác.



Top 100 câu hỏi thường gặp về Shell (dành cho người học lập trình)#

Đây là danh sách các câu hỏi từ cơ bản đến nâng cao, được chia thành nhiều nhóm để bạn dễ dàng học và luyện tập.

I. Tổng quan về Shell & Lệnh cơ bản (20 câu)

  • Shell là gì và vai trò của nó trong hệ điều hành?

  • Phân biệt Shell và Terminal.

  • Liệt kê một số loại Shell phổ biến và ưu nhược điểm của chúng.

  • Làm thế nào để kiểm tra Shell mặc định của bạn?

  • Lệnh ls dùng để làm gì? Nêu các tùy chọn phổ biến của nó.

  • Lệnh cd dùng để làm gì? Giải thích cd ~, cd -, cd ...

  • Lệnh pwd dùng để làm gì?

  • Lệnh mkdirrmdir dùng để làm gì?

  • Lệnh touch dùng để làm gì?

  • Lệnh cp dùng để làm gì? Nêu ví dụ về sao chép tệp và thư mục.

  • Lệnh mv dùng để làm gì? Nêu ví dụ về di chuyển tệp và đổi tên tệp.

  • Lệnh rm dùng để làm gì? Giải thích các tùy chọn -r, -f, -i.

  • Lệnh cat dùng để làm gì?

  • Lệnh lessmore dùng để làm gì? Khi nào nên sử dụng chúng?

  • Lệnh echo dùng để làm gì?

  • Lệnh man dùng để làm gì? Làm thế nào để sử dụng nó để tìm hiểu về một lệnh?

  • Lệnh history dùng để làm gì?

  • Làm thế nào để thực hiện lại một lệnh từ lịch sử?

  • Phân biệt đường dẫn tuyệt đối và đường dẫn tương đối. Cho ví dụ.

  • Làm thế nào để tạm dừng/tiếp tục/thoát khỏi một lệnh đang chạy trong terminal?

II. Quản lý Tệp và Thư mục Nâng cao (15 câu)

  • Làm thế nào để tìm kiếm tệp hoặc thư mục theo tên trong Shell? (lệnh find)

  • Làm thế nào để tìm kiếm tệp theo nội dung? (lệnh grep)

  • Giải thích các tùy chọn -r, -i, -v, -n của grep.

  • Làm thế nào để nén và giải nén tệp/thư mục? (lệnh tar, gzip, unzip)

  • Giải thích các quyền truy cập tệp (permissions) trong Linux/Unix (rwx).

  • Làm thế nào để thay đổi quyền truy cập tệp? (lệnh chmod)

  • Giải thích các chế độ số (octal modes) của chmod (ví dụ: 755, 644).

  • Làm thế nào để thay đổi chủ sở hữu tệp? (lệnh chown)

  • Làm thế nào để thay đổi nhóm của tệp? (lệnh chgrp)

  • Symlink (Symbolic Link) là gì? Tạo và xóa symlink như thế nào? (lệnh ln -s)

  • Hard Link là gì? Phân biệt Symlink và Hard Link.

  • Làm thế nào để xem dung lượng tệp và thư mục? (lệnh du, df)

  • Làm thế nào để xem thông tin chi tiết về một tệp? (lệnh stat)

  • Làm thế nào để tạo nhiều thư mục cùng một lúc? (ví dụ: mkdir -p)

  • Làm thế nào để xem 10 dòng đầu/cuối của một tệp? (lệnh head, tail)

III. I/O Redirection & Pipelines (15 câu)

  • Input Redirection là gì? Dấu < được sử dụng như thế nào?

  • Output Redirection là gì? Dấu >>> khác nhau như thế nào?

  • Standard Output (stdout), Standard Error (stderr), Standard Input (stdin) là gì?

  • Làm thế nào để chuyển hướng cả stdout và stderr vào cùng một tệp?

  • Làm thế nào để bỏ qua output của một lệnh? (chuyển hướng vào /dev/null)

  • Pipeline là gì? Dấu | được sử dụng như thế nào?

  • Nêu ví dụ về việc sử dụng pipeline để kết hợp các lệnh.

  • Sử dụng grep với pipeline để lọc kết quả của ls.

  • Sử dụng wc (word count) với pipeline để đếm số dòng/từ/ký tự.

  • Sử dụng sort với pipeline để sắp xếp output.

  • Sử dụng uniq với pipeline để loại bỏ các dòng trùng lặp.

  • Lệnh tee dùng để làm gì?

  • Phân biệt >2> trong redirection.

  • Làm thế nào để kết nối output của một lệnh làm input cho một lệnh khác mà không dùng |? (xargs)

  • Viết một lệnh sử dụng pipeline để hiển thị 5 tiến trình đang sử dụng nhiều RAM nhất.

IV. Shell Scripting Cơ bản (20 câu)

  • Shell Script là gì và tại sao chúng lại hữu ích?

  • Làm thế nào để tạo một Shell Script và làm cho nó có thể thực thi được?

  • Shebang (ví dụ: #!/bin/bash) là gì và ý nghĩa của nó?

  • Làm thế nào để khai báo biến trong Shell Script? Nêu ví dụ.

  • Làm thế nào để truy cập giá trị của biến? (sử dụng $)

  • Tham số dòng lệnh (command-line arguments) là gì? Làm thế nào để truy cập chúng trong script ($1, $2, $@, $#)?

  • Biến môi trường là gì? Nêu một số biến môi trường phổ biến (ví dụ: PATH, HOME).

  • Làm thế nào để xuất biến môi trường? (lệnh export)

  • Lệnh read dùng để làm gì? Nêu ví dụ về việc nhận input từ người dùng.

  • Cấu trúc điều khiển if-else trong Shell Script như thế nào? Nêu ví dụ.

  • Các toán tử so sánh số (-eq, -ne, -gt, -lt, -ge, -le) trong Shell Script.

  • Các toán tử so sánh chuỗi (=, !=, -z, -n) trong Shell Script.

  • Cấu trúc lặp for trong Shell Script như thế nào? Nêu ví dụ.

  • Cấu trúc lặp while trong Shell Script như thế nào? Nêu ví dụ.

  • Lệnh test hoặc [ dùng để làm gì trong điều kiện?

  • Hàm (Functions) trong Shell Script là gì? Làm thế nào để định nghĩa và gọi hàm?

  • Làm thế nào để xử lý lỗi trong Shell Script? (sử dụng set -e, exit)

  • Lệnh trap dùng để làm gì trong Shell Script?

  • &&|| trong Shell Script dùng để làm gì? (logic AND/OR)

  • Viết một Shell Script đơn giản nhận một tên tệp làm tham số và kiểm tra xem tệp đó có tồn tại hay không.

V. Lệnh & Kỹ thuật Nâng cao (20 câu)

  • alias dùng để làm gì? Tạo và xóa alias như thế nào?

  • Background process và Foreground process là gì? (sử dụng &, fg, bg, jobs)

  • Lệnh nohup dùng để làm gì?

  • croncrontab dùng để làm gì? Tạo một cron job như thế nào?

  • Regular Expressions (Regex) là gì và ứng dụng của chúng trong Shell?

  • Lệnh sed dùng để làm gì? Nêu ví dụ về thay thế chuỗi.

  • Lệnh awk dùng để làm gì? Nêu ví dụ về xử lý văn bản theo cột.

  • Lệnh ssh dùng để làm gì?

  • Lệnh scp dùng để làm gì?

  • Lệnh wget hoặc curl dùng để làm gì? Phân biệt chúng.

  • Làm thế nào để giám sát các tiến trình đang chạy? (lệnh ps, top, htop)

  • Làm thế nào để gửi tín hiệu đến một tiến trình? (lệnh kill, killall)

  • Lệnh dfdu khác nhau như thế nào?

  • PATH biến môi trường là gì? Cách Shell tìm kiếm các lệnh thực thi.

  • Làm thế nào để thêm một thư mục vào PATH?

  • source hoặc . lệnh dùng để làm gì? Khi nào nên sử dụng nó?

  • Làm thế nào để tìm kiếm các lệnh liên quan đến một chủ đề cụ thể? (lệnh apropos)

  • Lệnh netstat hoặc ss dùng để làm gì?

  • Làm thế nào để giải nén một tệp .tar.gz?

  • Lệnh tr dùng để làm gì? Nêu ví dụ về thay thế ký tự.

VI. Vấn đề thực tế và Tối ưu (10 câu)

  • Nêu một ví dụ về Shell Script tự động hóa việc sao lưu dữ liệu.

  • Làm thế nào để xử lý các tệp có khoảng trắng trong tên trong Shell Script?

  • Làm thế nào để kiểm tra trạng thái thoát (exit status) của lệnh trước đó? ($?)

  • Viết một Shell Script để nén tất cả các tệp trong một thư mục thành các tệp .zip riêng lẻ.

  • Làm thế nào để gỡ lỗi (debug) một Shell Script? (sử dụng set -x)

  • Phân biệt execsource.

  • Làm thế nào để đếm số dòng trong một tệp mà không chứa một chuỗi cụ thể?

  • Kịch bản nào bạn sẽ dùng Shell để tự động hóa trong quy trình làm việc của mình?

  • Làm thế nào để tạo một thanh tiến trình đơn giản trong Shell Script?

  • Nêu một số lời khuyên để viết Shell Script hiệu quả và dễ bảo trì.



Hy vọng danh sách này sẽ giúp bạn có một lộ trình học tập vững chắc về Shell. Shell là một kỹ năng cực kỳ giá trị, đặc biệt trong môi trường phát triển và quản trị hệ thống. Hãy thực hành thật nhiều để nắm vững chúng nhé!

Bài liên quan trong #Shell

✓ Đã sao chép link