Bash script là một công cụ mạnh mẽ giúp tự động hóa các tác vụ và quản lý hệ thống hiệu quả, thông qua cú pháp dễ hiểu và khả năng mở rộng cao. Khi hiểu thành thạo Bash script, bạn có thể xử lý các tác vụ phức tạp nhanh chóng và hiệu quả hơn.
Đọc bài viết này để hiểu rõ hơn về:
- Bash script là gì? Ưu và nhược điểm của nó?
- Cách Bash script hoạt động
- Các khái niệm cơ bản của Bash script
- Cách chạy Bash script hiệu quả
Bash script là gì?
Bash script là một tệp văn bản chứa các lệnh mà bạn muốn máy tính thực hiện tự động. Nó giống như một kịch bản phim, nhưng là dành cho máy tính.
Các lệnh trong Bash script thường là những lệnh mà bạn có thể gõ trực tiếp trên dòng lệnh như ls (liệt kê thư mục) hay cp (sao chép tệp). Ngoài ra, trong Bash script, bạn có thể sử dụng các công cụ và cú pháp mạnh mẽ như vòng lặp, các hàm để tự động hóa những công việc phức tạp mà nếu làm thủ công trên dòng lệnh, bạn sẽ phải nhập nhiều lệnh khác nhau.
Một điều thú vị là mọi lệnh bạn có thể chạy trên dòng lệnh đều có thể đưa vào Bash script, và nó sẽ hoạt động chính xác như khi bạn gõ thủ công. Bạn không cần phải thay đổi cách viết lệnh, chỉ cần nhập chúng vào tệp văn bản và chạy tệp đó. Nếu bạn đã quen thuộc với dòng lệnh, thì viết Bash script sẽ rất dễ dàng với bạn.
Thường thì các tệp Bash script sẽ có phần mở rộng .sh, mặc dù hệ thống Linux không yêu cầu phải có phần mở rộng này để script có thể chạy.
Đọc thêm: Bash Shell là gì? Các tính năng chính của Bash Shell
Ưu – nhược điểm của Bash Script
Ưu điểm của Bash Script là gì?
- Có khả năng tự động hóa: Bash script giúp tự động hóa các tác vụ lặp đi lặp lại như sao lưu, quản lý tệp tin hay cài đặt phần mềm, giúp tiết kiệm thời gian và giảm thiểu sai sót khi thực hiện thủ công.
- Tính di động cao: Bash script có thể chạy trên nhiều nền tảng khác nhau như Unix, Linux, macOS và thậm chí trên Windows nếu sử dụng phần mềm giả lập hoặc máy ảo. Điều này giúp Bash script rất linh hoạt và dễ sử dụng trên nhiều hệ điều hành.
- Tính linh hoạt cao: Bạn có thể dễ dàng chỉnh sửa và điều chỉnh Bash script để phù hợp với nhu cầu cụ thể. Hơn nữa, chúng có thể được kết hợp với các ngôn ngữ lập trình khác hoặc các công cụ bổ sung để tạo ra những script mạnh mẽ hơn.
- Dễ tiếp cận: Viết Bash script rất đơn giản và không cần các công cụ phức tạp. Bạn chỉ cần một trình soạn thảo văn bản cơ bản và shell interpreter đã có sẵn trong hầu hết các hệ điều hành.
- Khả năng tích hợp: Bash script có thể tích hợp với các công cụ và ứng dụng khác như cơ sở dữ liệu, máy chủ web hay dịch vụ đám mây, cho phép thực hiện các tác vụ quản lý hệ thống và tự động hóa phức tạp hơn.
Nhược điểm của Bash Script là gì?
- Chậm hơn chương trình thông thường: So với các chương trình được biên dịch như C hay Java, Bash script thường chạy chậm hơn do nó phải thực thi từng lệnh trong script theo dạng dòng lệnh, thay vì thực thi như một chương trình đã biên dịch sẵn.
- Khả năng sử dụng hạn chế: Mặc dù Bash script rất hữu ích trong việc tự động hóa các tác vụ hệ thống cơ bản, nhưng nó có hạn chế khi so với các chương trình truyền thống. Bash không phải là ngôn ngữ lập trình đầy đủ, vì vậy nó không phù hợp cho những tác vụ phức tạp hoặc yêu cầu giao diện người dùng đồ họa (GUI).
- Khởi động quá trình mới cho mỗi lệnh: Mỗi khi thực thi một lệnh trong Bash script, một tiến trình mới được khởi động. Điều này có thể làm tốn tài nguyên hệ thống, đặc biệt là khi script trở nên phức tạp với nhiều lệnh liên tiếp, khiến hiệu suất bị giảm.
- Về tính bảo mật: Bash script có thể gặp lỗ hổng bảo mật nếu không xử lý đúng đầu vào người dùng, đặc biệt là khi chạy với quyền root hoặc sudo.
- Tính di động giữa các phiên bản shell: Script có thể hoạt động khác nhau trên các phiên bản bash khác nhau hoặc trên các shell khác như sh, zsh, etc.
- Hạn chế về khả năng gỡ lỗi: Bash hạn chế trong việc gỡ lỗi so với các ngôn ngữ lập trình hiện đại khác. Mặc dù có các tùy chọn như -x để hiển thị từng lệnh khi thực thi, nhưng Bash không có công cụ gỡ lỗi tích hợp đầy đủ như các IDE hiện đại.
Bash script hoạt động như thế nào?
Trước khi tìm hiểu cách Bash script hoạt động, chúng ta cần nắm một số khái niệm cơ bản về chương trình (program) và quá trình (process) trong máy tính.
- Chương trình: là một tệp dữ liệu chứa các hướng dẫn mà CPU cần thực hiện, ví dụ như các tệp nhị phân hoặc mã nguồn đã được biên dịch. Chương trình có thể bao gồm các tài nguyên khác như hình ảnh, âm thanh, v.v., và thường được lưu trên ổ cứng của máy tính.
- Quá trình (process): là một phiên bản đang chạy của một chương trình. Khi bạn chạy một chương trình, hệ điều hành không trực tiếp thực thi chương trình đó từ ổ cứng mà nó sao chép các hướng dẫn của chương trình vào bộ nhớ RAM và khởi tạo một quá trình mới để thực thi các lệnh. Mỗi quá trình sẽ có không gian bộ nhớ riêng để lưu trữ các biến tạm thời và các dữ liệu cần thiết trong quá trình thực thi.
Khi ta mở một terminal và thực hiện một lệnh như cp (sao chép tệp), hệ thống sẽ tạo ra một quá trình mới cho lệnh đó. Nếu mở nhiều terminal và chạy cùng một lệnh, mỗi terminal sẽ tạo ra một quá trình riêng biệt cho lệnh cp. Sau khi quá trình hoàn thành, hệ thống sẽ hủy bỏ quá trình đó.
Khi chạy một Bash script, nó sẽ không chạy trong quá trình Bash hiện tại mà thay vào đó sẽ tạo ra một quá trình mới để thực thi các lệnh trong script. Quá trình này làm việc độc lập và sẽ bị hệ thống hủy bỏ khi script hoàn thành.
Một số khái niệm cơ bản của Bash script
Quy ước đặt tên
Trong Bash scripting, việc đặt tên tệp và biến rất quan trọng để dễ quản lý và duy trì mã nguồn. Một số quy ước đặt tên biến trong Bash:
- Tên biến phải bắt đầu bằng một chữ cái hoặc dấu gạch dưới (_)
- Tên biến có thể chứa chữ cái, số và dấu gạch dưới.
- Tên biến không được chứa khoảng trắng hoặc ký tự đặc biệt.
- Tên biến trong Bash phân biệt chữ hoa và chữ thường.
- Tên biến không được trùng với các từ khóa đã được hệ thống dành riêng, như if, then, else, fi…
- Các hằng số thường được viết hoa hoàn toàn.
Ý nghĩa của ./
Khi bạn chạy một lệnh thông thường trên terminal như ls, bạn chỉ cần gõ tên lệnh và hệ thống sẽ thực thi nó.
Tuy nhiên, khi chạy một Bash script trong thư mục hiện tại, bạn cần phải sử dụng dấu ./ trước tên script. Việc này là do Bash không tự động tìm kiếm trong thư mục hiện tại khi bạn chỉ gõ tên lệnh. Thay vào đó, nó chỉ tìm lệnh trong các thư mục được liệt kê trong biến môi trường $PATH.
$PATH là biến chứa một danh sách các thư mục, nơi mà Bash tìm kiếm các lệnh. Nếu bạn không chỉ định rõ nơi chứa script, Bash sẽ không thể tìm thấy nó trong thư mục hiện tại
Ví dụ, khi gõ lệnh echo $PATH, bạn sẽ thấy danh sách các thư mục như:
/home/ryan/bin:/usr/local/bin:/usr/bin:/bin
Dòng trên có nghĩa là Bash sẽ chỉ tìm kiếm lệnh trong các thư mục này. Nếu bạn không thêm ./ và chỉ gõ tên script, Bash sẽ không tìm thấy nó trong $PATH vì thư mục hiện tại không nằm trong danh sách này.
Vì vậy, khi bạn sử dụng ./, bạn đang chỉ rõ Bash tìm kiếm script trong thư mục hiện tại. Đây là cách an toàn và rõ ràng để đảm bảo rằng bạn đang chạy đúng tệp script mong muốn.
Shebang [#]
Trong một Bash script, shebang là dòng đầu tiên của tệp và có vai trò rất quan trọng. Shebang bắt đầu bằng ký tự #!, theo sau là đường dẫn đến trình thông dịch (interpreter) mà script cần sử dụng để thực thi các lệnh trong tệp.
Đối với Bash script, shebang thường có dạng #!/bin/bash.
Dòng shebang cho hệ điều hành biết rằng tệp này là một script và cần được thực thi bởi Bash shell. Đây là cách để xác định trình thông dịch cho script mà không cần phải chỉ định trực tiếp khi chạy tệp. Nếu không có shebang, Bash sẽ mặc định xem script đó là một Bash script nếu bạn chạy nó trong Bash shell.
Một số ví dụ về shebang với các trình thông dịch khác nhau:
- #!/bin/bash — Sử dụng Bash.
- #!/bin/sh — Sử dụng Bourne shell.
- #!/usr/bin/env python — Sử dụng Python (với công cụ env để tự động tìm đường dẫn đến Python).
- #!/usr/bin/pwsh — Sử dụng PowerShell.
Mặc dù có thể bỏ qua shebang và chạy script bằng cách chỉ định bash myscript.sh, nhưng điều này không phải là cách an toàn và tiện lợi nhất. Vì vậy, việc luôn luôn thêm shebang vào đầu mỗi Bash script là cách tốt nhất để đảm bảo tính tương thích và dễ dàng thực thi.
Hàm (function)
Trong Bash script, hàm là một đoạn mã được nhóm lại với nhau để thực hiện một nhiệm vụ cụ thể. Hàm giúp mã nguồn trở nên gọn gàng hơn, dễ dàng tái sử dụng và bảo trì.
Khi bạn cần thực hiện một tác vụ nhiều lần trong script, thay vì viết lại cùng một đoạn mã, bạn có thể định nghĩa hàm và gọi hàm đó bất kỳ lúc nào.
Cấu trúc cơ bản để định nghĩa một hàm trong Bash như sau:
my_function() { echo "Hello, World!" }
Trong đó: my_function là tên của hàm và lệnh bên trong dấu {} là mã mà hàm thực thi. Để gọi hàm này, bạn chỉ cần viết tên hàm trong script như sau:
my_function
Xử lý lỗi và debug
Khi viết Bash script, việc xử lý lỗi và debug rất quan trọng để đảm bảo script chạy đúng và dễ dàng khắc phục khi gặp vấn đề. Dưới đây là một số kỹ thuật cơ bản giúp bạn xử lý lỗi và debug trong Bash script:
Chuyển hướng thông báo lỗi
Để ghi lại lỗi vào một tệp, bạn có thể sử dụng 2>, ví dụ:
command 2> error_log.txt
Lệnh trên sẽ chuyển các thông báo lỗi (STDERR) của command vào tệp error_log.txt.
Dừng script khi gặp lỗi
Bạn có thể sử dụng set -e để dừng thực thi script ngay khi gặp lỗi. Điều này giúp tránh các vấn đề phát sinh khi script tiếp tục chạy dù gặp lỗi.
set -e
Debug với set -x
Để theo dõi các lệnh được thực thi trong script, bạn có thể dùng set -x. Lệnh này sẽ in ra từng lệnh khi nó được thực thi, giúp bạn dễ dàng phát hiện lỗi.
Kết hợp STDOUT và STDERR
Để ghi cả kết quả đầu ra (STDOUT) và lỗi (STDERR) vào cùng một tệp, bạn có thể sử dụng 2>&1. Điều này giúp bạn có một bản ghi đầy đủ của tất cả những gì xảy ra khi script chạy.
command > output_log.txt 2>&1
Sử dụng trap để bắt tín hiệu
trap là một công cụ mạnh mẽ cho phép bạn bắt và xử lý các tín hiệu hệ thống (như Ctrl+C) hoặc các sự kiện khác trong script. Điều này đặc biệt hữu ích khi bạn cần dọn dẹp tài nguyên trước khi script kết thúc.
#!/bin/bash # Tạo file tạm thời TEMP_FILE="/tmp/mydata_$$.tmp" touch $TEMP_FILE # Hàm dọn dẹp sẽ được gọi khi script kết thúc cleanup() { echo "Đang dọn dẹp tài nguyên..." rm -f $TEMP_FILE echo "Đã xóa file tạm: $TEMP_FILE" } # Đăng ký hàm cleanup để xử lý khi nhận các tín hiệu # EXIT: Khi script kết thúc bình thường # SIGINT: Khi người dùng nhấn Ctrl+C (gián đoạn) # SIGTERM: Khi script bị yêu cầu kết thúc (terminate) trap cleanup EXIT SIGINT SIGTERM echo "Đang thực hiện công việc..." echo "Dữ liệu tạm thời được lưu tại: $TEMP_FILE" # Giả lập công việc đang chạy echo "Script đang chạy, thử nhấn Ctrl+C để xem trap hoạt động..." sleep 10 echo "Script hoàn thành công việc!" # Khi script kết thúc, hàm cleanup sẽ tự động được gọi
Trong ví dụ này:
- Script tạo một file tạm thời và sử dụng trap để đảm bảo file này sẽ được xóa khi script kết thúc.
- Chúng ta bắt 3 loại tín hiệu: EXIT (khi script kết thúc bình thường), SIGINT (khi người dùng nhấn Ctrl+C), và SIGTERM (khi có lệnh terminate được gửi đến script).
- Bất kể script kết thúc theo cách nào (bình thường hoặc bị gián đoạn), hàm cleanup() sẽ luôn được gọi để dọn dẹp tài nguyên.
Chạy Bash script như thế nào?
Việc chạy một Bash script khá đơn giản, nhưng trước khi thực thi, bạn cần đảm bảo rằng tệp script đã được cấp quyền thực thi (execute permission). Thông thường, quyền này không được cấp mặc định vì lý do bảo mật. Nếu bạn quên cấp quyền thực thi, hệ thống sẽ thông báo lỗi mà không gây hại gì.
Cấp quyền thực thi cho script
Trước tiên, bạn có thể kiểm tra quyền của tệp script bằng lệnh ls -l:
ls -l myscript.sh -rw-r--r-- 18 ryan users 4096 Feb 17 09:12 myscript.sh
Theo như dòng lệnh trên thì tệp myscript.sh hiện tại không có quyền thực thi. Để cấp quyền này, bạn sử dụng lệnh chmod:
chmod 755 myscript.sh
Lệnh này sẽ cấp quyền thực thi cho chủ sở hữu, nhóm và tất cả người dùng. Sau khi cấp quyền, bạn có thể kiểm tra lại quyền của tệp:
ls -l myscript.sh -rwxr-xr-x 18 ryan users 4096 Feb 17 09:12 myscript.sh
Chạy script
Khi tệp đã có quyền thực thi, bạn có thể chạy script bằng lệnh sau:
./myscript.sh
Hoặc:
bash myscript.sh
Lệnh này sẽ thực thi script và in ra kết quả như sau:
Hello World!
Với trường hợp truyền tham số thì có thể chạy script như sau:
./myscript.sh param1 param2
Chạy dưới background
Bạn có thể chạy một số công việc dưới nền:
./myscript.sh &
Và cách sử dụng nohup để script tiếp tục chạy ngay cả khi người dùng đăng xuất:
nohup ./myscript.sh &
Các phương pháp để sử dụng Bash script hiệu quả hơn
- Thêm các lệnh kiểm tra lỗi: Để tránh lỗi khi chạy script, sử dụng set -e ở đầu script để dừng script nếu có lỗi xảy ra, giúp bạn tránh được những vấn đề không mong muốn trong quá trình thực thi.
- Sử dụng hàm cho các tác vụ lặp lại: Khi bạn cần thực hiện cùng một tác vụ nhiều lần trong script, hãy đóng gói chúng vào các hàm. Điều này giúp mã nguồn gọn gàng và dễ bảo trì hơn.
- Giữ script ngắn gọn và có chú thích rõ ràng: Các script nên được chia nhỏ thành các phần dễ hiểu và dễ duy trì. Thêm chú thích đầy đủ để người khác (hoặc chính bạn trong tương lai) có thể dễ dàng hiểu mã nguồn.
- Sử dụng hệ thống quản lý phiên bản (như Git): Để theo dõi sự thay đổi và phát triển của script, việc sử dụng Git hoặc các công cụ tương tự giúp bạn quản lý phiên bản và dễ dàng quay lại phiên bản trước nếu cần.
- Sử dụng cheat sheet Bash: Các bảng tra cứu (cheat sheet) có thể giúp bạn tiết kiệm thời gian học và tìm kiếm cú pháp khi viết script, giúp tăng tốc quá trình học và áp dụng kiến thức.
Câu hỏi thường gặp về Bash script
Powershell có tương tự như Bash script không?
Powershell và Bash script đều là công cụ dòng lệnh được sử dụng để tự động hóa các tác vụ trên hệ thống, nhưng chúng hoạt động khác nhau. Powershell chủ yếu được sử dụng trên hệ điều hành Windows và hỗ trợ các lệnh cmdlets, giúp quản trị viên dễ dàng quản lý hệ thống Windows.
Bash script, ngược lại, được thiết kế cho các hệ điều hành Unix-like như Linux và macOS, cung cấp cú pháp mạnh mẽ hơn cho việc tự động hóa các tác vụ trong môi trường dòng lệnh. Mặc dù cả hai công cụ đều giúp tự động hóa, Powershell chủ yếu dành cho quản trị hệ thống Windows, trong khi Bash script hoạt động tốt trên các hệ điều hành Unix.
Đọc thêm: PowerShell là gì chi tiết: Tính năng, Cài đặt, Mẹo sử dụng nên biết
Bash Script có thể được sử dụng để tự động hóa công việc không?
Có, Bash Script rất phù hợp trong việc tự động hóa các tác vụ trên hệ thống. Bạn có thể sử dụng Bash script để sao lưu dữ liệu, quản lý tệp, kiểm tra trạng thái hệ thống và thực hiện các quy trình khác mà bạn thường làm thủ công. Nhờ vào khả năng tự động hóa này, bạn có thể tiết kiệm thời gian, giảm thiểu sai sót và thực hiện các tác vụ phức tạp một cách hiệu quả.
Python có phải là Bash script không?
Không, Python và Bash script là hai loại script khác nhau.
Bash script là tập hợp các lệnh trong Bash shell, giúp thực hiện các tác vụ hệ thống và tự động hóa quy trình trên các hệ điều hành Unix-like. Python, ngược lại, là một ngôn ngữ lập trình đa năng và có thể được sử dụng cho nhiều mục đích, bao gồm lập trình web, phân tích dữ liệu và phát triển phần mềm.
Mặc dù cả hai đều có thể dùng để tự động hóa, nhưng Python thường được sử dụng cho các ứng dụng phức tạp hơn so với Bash script, vốn được thiết kế cho các tác vụ hệ thống cơ bản.
Đọc thêm: Python là gì: Tổng quan định nghĩa, Cú pháp và Thư viện Python
Tổng kết
Bash Script là công cụ không thể thiếu đối với những người làm việc trong môi trường Unix-like. ITviec hy vọng bài viết đã cung cấp cho bạn kiến thức tổng quan về Bash script. Việc hiểu rõ các khái niệm cơ bản và kỹ thuật xử lý lỗi sẽ giúp bạn phát triển những script mạnh mẽ và hiệu quả.