Bash Shell là một công cụ quan trọng trong Unix/Linux, giúp người dùng thực thi lệnh và quản lý hệ thống thông qua dòng lệnh. Bash không chỉ cung cấp các lệnh cơ bản mà còn hỗ trợ nhiều tính năng nâng cao như scripting, điều hướng file, quản lý tiến trình và tự động hóa tác vụ.
Đọc bài viết này để hiểu rõ hơn về:
- Bash Shell là gì?
- Các tính năng của Bash Shell
- Vì sao nên sử dụng Bash?
- Bash script là gì?
- Phân biệt Bash Script và Shell Script
Bash Shell là gì?
Bash
Bash (Bourne Again Shell) là một trình thông dịch lệnh và ngôn ngữ scripting* mạnh mẽ, phổ biến trên Linux, macOS và các hệ thống Unix-like. Tên gọi “Bash” vừa là tên Stephen Bourne, tác giả của Bourne Shell, vừa mang ý nghĩa “Bourne-again Shell” – một phiên bản tái sinh và mở rộng từ Bourne Shell.
* Một ngôn ngữ lập trình thông thường (như C, Java) cần phải biên dịch trước khi chạy. Ngược lại, ngôn ngữ scripting là loại ngôn ngữ mà mã nguồn được thực thi trực tiếp thông qua một trình thông dịch mà không cần biên dịch thành mã máy trước,giúp việc viết, kiểm thử và chạy chương trình trở nên nhanh chóng hơn.
Bash kế thừa các tính năng của Bourne Shell, đồng thời tích hợp thêm nhiều đặc điểm giống Korn Shell (ksh) và C Shell (csh). Bash còn cung cấp các tính năng nâng cao như chỉnh sửa dòng lệnh, lịch sử lệnh (line editing), lịch sử lệnh (command history), tab completion, mở rộng cú pháp (syntax expansion), giúp thao tác nhanh hơn và hiệu quả hơn.
Bash tuân thủ tiêu chuẩn shell của IEEE POSIX và có mức độ tương thích cao với Bourne Shell, cho phép chạy phần lớn các script viết cho Bourne Shell mà không cần chỉnh sửa.
Bash không chỉ giúp người dùng nhập và thực thi lệnh trực tiếp trên terminal, mà còn cho phép viết tập hợp nhiều lệnh vào một file (thường có đuôi .sh) và chạy chúng một cách tự động mà không cần biên dịch. Điều này giúp Bash trở thành công cụ mạnh mẽ để tự động hóa công việc, chẳng hạn như sao lưu dữ liệu định kỳ, quản lý hệ thống (cài đặt phần mềm, kiểm tra tài nguyên, giám sát tiến trình) và chạy lệnh hàng loạt mà không cần nhập thủ công từng lệnh một.
Shell
Shell là chương trình trung gian giữa người dùng (hoặc phần mềm khác) và hệ điều hành, cho phép nhập lệnh để điều khiển hệ thống. Thay vì sử dụng giao diện đồ họa (GUI) với chuột và cửa sổ, shell cho phép tương tác trực tiếp bằng dòng lệnh (CLI – Command Line Interface).
Shell hoạt động bên ngoài kernel (hạt nhân hệ điều hành), giúp người dùng thực hiện các thao tác như quản lý file và thư mục (tạo, xóa, di chuyển, đổi tên), quản lý tiến trình (khởi động, dừng, kiểm tra chương trình đang chạy) hay tự động hóa tác vụ thông qua scripting.
Dựa trên cách thức tương tác, shell được chia thành hai loại chính:
- Shell giao diện dòng lệnh (CLI – Command Line Interface): Shell CLI như Bash Shell, Zsh, Csh, hay Ksh cho phép người dùng nhập lệnh trực tiếp để thao tác với hệ điều hành. Loại shell này có ưu điểm là hiệu quả, tiết kiệm tài nguyên, tốc độ cao và cung cấp khả năng điều khiển chi tiết, nhưng đòi hỏi người dùng phải nắm vững cú pháp và các lệnh.
- Shell giao diện đồ họa (GUI – Graphical User Interface): Shell giao diện đồ họa (GUI Shell) cung cấp môi trường tương tác trực quan giữa người dùng và hệ điều hành thông qua cửa sổ, biểu tượng, menu, và chuột. Ví dụ, Windows Shell trên Windows hoặc GNOME/KDE trên Linux là các GUI Shell, giúp người dùng thao tác mà không cần nhập lệnh. Tuy nhiên, hầu hết các hệ điều hành có giao diện GUI vẫn cung cấp một terminal hoặc command prompt để hỗ trợ các tác vụ dòng lệnh cho quản trị viên hệ thống hoặc người dùng nâng cao.
Tóm lại, Bash Shell là một trong những trình thông dịch lệnh phổ biến và mạnh mẽ, cung cấp giao diện dòng lệnh để tương tác với hệ điều hành hiệu quả, cho phép viết script tự động hóa, giúp đơn giản hóa các tác vụ như quản lý hệ thống, xử lý dữ liệu và thực hiện lệnh hàng loạt.
Để sử dụng Bash, bạn chỉ cần mở terminal và bắt đầu nhập lệnh:
- Trên Linux: Ctrl + Alt + TT
- Trên mac OS: Tìm “Terminal” trong Spotlight hoặc ứng dụng Utilities.
- Trên Windows: Sử dụng Windows Subsystem for Linux (WSL), Cygwin hoặc Git Bash.
Bash hoạt động như thế nào?
Bash Shell hoạt động như một trình thông dịch lệnh. Quá trình xử lý lệnh diễn ra như sau:
Đọc lệnh người dùng nhập
Khi bạn nhập một lệnh vào terminal và nhấn Enter, Bash sẽ nhận toàn bộ nội dung dòng lệnh. Nếu có nhiều lệnh trên cùng một dòng, Bash sẽ tách chúng ra dựa vào dấu ; (thực thi tuần tự) hoặc | (pipe để chuyển đầu ra của lệnh này thành đầu vào của lệnh kia).
Bash cũng hỗ trợ các ký hiệu khác như && (chỉ chạy lệnh tiếp theo nếu lệnh trước thành công) hoặc || (chỉ chạy lệnh tiếp theo nếu lệnh trước thất bại). Ví dụ:
cmd1 && cmd2 # cmd2 chỉ chạy nếu cmd1 thành công cmd1 || cmd2 # cmd2 chỉ chạy nếu cmd1 thất bại
Phân tích cú pháp (Parsing)
Bash kiểm tra cú pháp (syntax) của lệnh để đảm bảo nó hợp lệ. Nếu có lỗi cú pháp (ví dụ: dấu ngoặc hoặc dấu nháy không khớp), Bash sẽ báo lỗi ngay.
Mở rộng các ký hiệu và biến
Bash thay thế các biến môi trường, alias, wildcard (*, ?), và thực hiện các phép toán trên lệnh. Các bước mở rộng bao gồm:
Mở rộng alias (Alias Expansion)
Alias là tên viết tắt cho một lệnh dài. Bash sẽ kiểm tra xem bạn có đặt alias nào cho lệnh vừa nhập hay không. Nếu có, Bash sẽ thay thế alias bằng nội dung gốc trước khi tiếp tục xử lý lệnh.
Ví dụ:
alias ll='ls -la' # Định nghĩa alias ll
Khi gõ ll, Bash sẽ tự động thay thế thành ls -la.
Mở rộng biến (Variable Expansion) ($HOME, $USER)
Nếu bạn sử dụng biến trong lệnh ($VAR), Bash sẽ thay biến đó bằng giá trị thực tế trước khi chạy lệnh. Nếu biến không tồn tại, nó sẽ để trống hoặc hiển thị lỗi.
Ví dụ:
name="Alice" echo "Hello, $name"
Bash sẽ thay $name bằng Alice, sau đó thực thi lệnh:
echo "Hello, Alice"
Mở rộng wildcard (Wildcard Expansion) (*.txt)
Bash tự động mở rộng các ký tự đại diện (*, ?, [ ]) thành danh sách file có trong thư mục hiện tại, giúp bạn không cần nhập tên file thủ công.
Ví dụ:
ls *.txt
Bash sẽ thay *.txt thành danh sách tất cả các file .txt trong thư mục, ví dụ:
ls file1.txt file2.txt notes.txt
Mở rộng lệnh con (Command Substitution) ($(command))
Khi bạn sử dụng dấu $(command) hoặc dấu `command`, Bash sẽ chạy lệnh bên trong trước, rồi thay thế nó bằng kết quả.
Ví dụ:
echo "Hôm nay là: $(date)"
Bash sẽ chạy lệnh date trước, rồi thay thế vào chuỗi:
echo "Hôm nay là: Thứ Hai, 04/03/2024"
Thực thi lệnh system call của kernel
Sau khi xử lý xong cú pháp và mở rộng lệnh, Bash kiểm tra xem lệnh có phải là built-in hay external command. Nếu lệnh là một chương trình bên ngoài, Bash sử dụng fork() để tạo một tiến trình con, sau đó dùng exec() để thực thi lệnh.
- Lệnh built-in (cd, echo, exit): Bash thực thi ngay.
- Lệnh external (ls, grep, python): Bash tìm kiếm trong biến $PATH và gọi hệ thống để chạy chương trình.
Trả kết quả về Terminal
Sau khi lệnh hoàn tất, Bash trả kết quả đầu ra về terminal. Nếu có lỗi, Bash sẽ hiển thị thông báo lỗi. Nếu có chuyển hướng (redirection), kết quả có thể được ghi vào file thay vì hiển thị trên màn hình.
Ví dụ nếu có lỗi, Bash sẽ hiển thị thông báo lỗi như:
command not found
Ví dụ lưu kết quả vào file:
ls -l > output.txt
Kết quả của ls -l sẽ được lưu vào output.txt thay vì hiển thị trên màn hình
Các tính năng chính của Bash Shell
- Tương thích với Bourne Shell (sh): Bash kế thừa và mở rộng các tính năng từ Bourne Shell, đồng thời bổ sung nhiều tính năng từ Korn Shell (ksh) và C Shell (csh), như kiểm soát công việc (job control) và thao tác thư mục.
- Hỗ trợ tham số dòng lệnh (Command Line Options): Bash có thể được khởi động bằng các tùy chọn ngắn (-a, -b, -c) hoặc tùy chọn dài (–debugger, –help, –login).
- Tệp khởi động (Start-up Files): Khi khởi động, Bash đọc các file cấu hình như .bashrc, .profile, bash.bashrc giúp thiết lập môi trường làm việc.
- .bashrc: Cấu hình cho mỗi phiên terminal tương tác
- .bash_profile: Cấu hình khi đăng nhập
- /etc/bash.bashrc: Cấu hình toàn hệ thống
- Hỗ trợ phím tắt chỉnh sửa (Key Bindings): Cho phép tùy chỉnh các tổ hợp phím để chỉnh sửa lệnh nhanh chóng.
- Hỗ trợ mảng một chiều (Arrays): Bash cung cấp mảng giúp dễ dàng thao tác danh sách dữ liệu.
- Cấu trúc điều khiển (Control Structures): Cung cấp các lệnh điều kiện (if, case), vòng lặp (for, while, until) và cấu trúc select để tạo menu động.
- Ngăn xếp thư mục (Directory Stack): Lưu lịch sử các thư mục đã truy cập, cho phép di chuyển qua lại dễ dàng bằng pushd, popd và dirs.
- Chế độ hạn chế (Restricted Mode): Khi Bash chạy ở chế độ hạn chế (rbash hoặc bash –restricted), nó giới hạn quyền thực thi lệnh để tăng tính bảo mật.
Bash Script là gì?
Bash Script là một tập hợp các lệnh Bash được viết trong một file (thường có phần mở rộng .sh) và thực thi tự động thay vì nhập từng lệnh thủ công trên terminal.
Bash Script giúp tự động hóa các tác vụ thay vì nhập thủ công từng lệnh trên terminal. Nó được sử dụng để quản lý hệ thống, sao lưu dữ liệu, cài đặt phần mềm và chạy lệnh hàng loạt.
Ví dụ: Một Bash Script đơn giản để in ra dòng chữ “Xin chào, Bash!”:
#!/bin/bash echo "Xin chào, Bash!"
Sau khi lưu file với tên script.sh, bạn có thể thực thi nó bằng cách:
chmod +x script.sh # Cấp quyền chạy cho script ./script.sh # Chạy script
Vì sao nên sử dụng Bash?
- Dễ học và dễ sử dụng: Bash có cú pháp đơn giản, dễ hiểu ngay cả với người mới (ví dụ: lệnh echo để in text). Có nhiều tài liệu và hướng dẫn miễn phí giúp bạn nhanh chóng làm quen.
- Giúp cải thiện kỹ năng lập trình: Học Bash giúp bạn hiểu rõ cách hệ điều hành hoạt động, làm quen với biến, vòng lặp, điều kiện, từ đó dễ dàng tiếp cận các ngôn ngữ lập trình khác như Python, JavaScript.
- Tăng hiệu suất làm việc: Bash giúp tự động hóa các tác vụ như sao lưu dữ liệu, quản lý file, kiểm tra hệ thống, giúp tiết kiệm thời gian và giảm thao tác lặp lại.
- Hỗ trợ làm việc với nhiều hệ điều hành: Bash có mặt trên Linux, macOS và có thể dùng trên Windows qua Git Bash hoặc WSL (Windows Subsystem for Linux), giúp bạn làm việc linh hoạt trên nhiều nền tảng.
- Mở rộng cơ hội nghề nghiệp: Biết Bash là một lợi thế lớn cho lập trình viên, DevOps, quản trị hệ thống, vì nhiều công việc IT yêu cầu kỹ năng shell scripting.
- Hỗ trợ làm việc nhóm và quản lý dự án: Bash chuẩn hóa quy trình làm việc qua script tái sử dụng để kiểm tra, triển khai ứng dụng, giúp đội nhóm phối hợp hiệu quả hơn.
Phân biệt Bash Script và Shell Script
Tiêu chí | Bash Script | Shell Script |
Định nghĩa | Là một dạng của Shell Script, nhưng có nhiều tính năng nâng cao hơn và chỉ chạy trên Bash Shell | Script có thể chạy trên nhiều loại shell khác nhau (sh, ksh, csh, zsh…). |
Tính phổ biến | Phổ biến trên Linux, macOS, và Windows (qua Git Bash). | Được dùng trên nhiều hệ thống Unix/Linux với các shell khác nhau. |
Tính năng | Hỗ trợ mảng, toán tử logic mở rộng, [[ … ]], lịch sử lệnh. | Ít tính năng nâng cao hơn, chủ yếu dựa trên Bourne Shell (sh). |
Tính tương thích | Có thể chạy hầu hết các script của Shell Script. | Không phải tất cả shell đều hỗ trợ Bash Script. |
Shebang sử dụng | #!/bin/bash | #!/bin/sh (hoặc các shell khác như #!/bin/ksh, #!/bin/csh). |
Cách chạy script Bash Shell cơ bản
Dưới đây là một ví dụ Bash Script để hiển thị lời chào và thực hiện một phép toán như sau:
#!/bin/bash # Hiển thị lời chào echo "Xin chào! Đây là một script Bash đơn giản." # Nhập tên từ người dùng echo "Nhập tên của bạn:" read name # Hiển thị tên người dùng echo "Chào, $name! Chúc bạn một ngày tốt lành." # Nhập hai số và tính tổng echo "Nhập số thứ nhất:" read num1 echo "Nhập số thứ hai:" read num2 # Tính tổng và hiển thị kết quả sum=$((num1 + num2)) echo "Tổng của $num1 và $num2 là: $sum"
Cách chạy script:
- Lưu file: với đuôi .sh, ví dụ: hello.sh.
- Cấp quyền thực thi cho script:
chmod +x hello.sh
- Chạy script:
./hello.sh
Giải thích:
- echo: Hiển thị nội dung ra terminal.
- read name: Nhập dữ liệu từ người dùng.
- $name: Biến lưu tên người dùng.
- read num1, read num2: Nhập hai số từ bàn phím.
- sum=$((num1 + num2)): Tính tổng hai số.
- echo: In kết quả ra màn hình.
Câu hỏi thường gặp về Bash Shell
Bash là shell hay terminal?
Bash là shell – trình thông dịch lệnh giúp người dùng gửi các lệnh đến hệ điều hành, không phải là terminal. Terminal là ứng dụng cung cấp giao diện để bạn tương tác với shell, ví dụ như terminal trên Linux hoặc Command Prompt trên Windows. Khi mở terminal, bạn có thể chạy Bash bên trong đó, nhưng chúng không phải là một.
Bash Shell có phải là Terminal không?
Không, Bash Shell không phải là terminal. Bash là công cụ dòng lệnh (command interpreter) chạy bên trong terminal, trong khi terminal chỉ là giao diện hiển thị và nhập lệnh.
Có thể dùng Bash trên Windows không?
Có, bạn có thể dùng Bash trên Windows thông qua các công cụ như Git Bash hoặc Windows Subsystem for Linux (WSL). Những công cụ này cung cấp môi trường Bash để chạy các lệnh tương tự như trên Linux và macOS.
Bash có giống CLI (Command Line Interface) không?
Bash cung cấp giao diện CLI (Command Line Interface), nhưng CLI là thuật ngữ chung để chỉ bất kỳ giao diện dòng lệnh nào. Nói cách khác, Bash là một ví dụ cụ thể của CLI, nhưng không phải tất cả các CLI đều là Bash.
Tổng kết Bash Shell
Bash không chỉ là một công cụ hỗ trợ thực thi lệnh mà còn là nền tảng quan trọng trong quản trị hệ thống và phát triển phần mềm. Với khả năng kết hợp nhiều lệnh, xử lý dữ liệu và tự động hóa công việc, Bash giúp tiết kiệm thời gian và tăng hiệu suất làm việc.