Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux/Bài 0

Từ Thư viện Khoa học VLOS
Bước tới: chuyển hướng, tìm kiếm

Loạt bài "Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux" của tác giả Làng Đậu giữ bản quyền 2006. Người đọc chỉ được sử dụng cho mụch đích học tập hay giảng dạy cho cá nhân. Cấm mọi hình thức sao chép, đăng lại, hay in lại nhằm mụch đích mua bán hay trục lợi mà không có sự cho phép chính thức của tác giả. Mọi thông tin về việc phổ biến rộng rãi có tính quảng bá tài liệu này cho mục đích giáo dục hay các phê bình, đề nghị về nội dung bài giảng xin liên lạc về vo_quang_nhan@yahoo.com

Dẫn Nhập

Các bạn thân mến,

Unix/Linux là một loại hệ điều hành đã có mặt từ rất sớm trong lịch sử của Khoa học Máy tính. Trong thời gian đầu của sự phát triển thì chưa có các dạng giao diện đồ hoạ phong phú cũng như thiết bị duy nhất để ra lệnh cho máy là bàn phím. Và do đó, hệ thống lệnh của hệ điều hành loại này phát triển sâu và rộng khắp. Việc ra lệnh trực tiếp đi xa hơn một bước là chúng được chứa dưới dạng một tập tin và như vậy hình thành các hệ thống có tên gọi là script hay "văn lệnh". Khi mà giao diện đồ hoạ đã bắt đầu phát triển có mặt thêm các thiết bị nhập dữ liệu mới hơn (như là chuột và máy quét) thì các Linux Guru (Chữ Guru là chữ du nhập từ tiếng Tây Tạng dùng để chỉ những người có khả năng và hiểu biết sâu sắc) bằng thói quen và cảm tình riêng với lối ra lệnh kiểu này, vẫn tiếp tục phát triển các thế hệ mệnh lệnh có thể gọi trực tiếp từ một đầu cuối giao diện (console). Xa hơn nữa, các nhà phát triển Linux/UNIX đã biến các lệnh hệ thống trở thành công cụ lập trình rất nhanh, nhẹ, và mạnh mẽ bằng cách sáng tạo ra các trình thông dịch có khả năng không thua kém với các trình biên dịch. Dó đó, ngày nay hầu như mọi thao tác từ việc khám đọc địa chỉ PCI của các thiết bị cho đến việc gửi thư điện tử hay các công việc quản lý máy vận hành theo thời khoá biểu đều có thể cài đặt hay cấu hình hoàn toàn không cần đến các giao diện đồ hoạ. Điều cần thiết là người dùng phải có kiến thức hiểu biết về các lệnh hệ thống cùng như cách thành lập và thi hành các văn lệnh.

Vì tính phức tạp của các loại văn lệnh trong hệ thống Linux, chúng tôi chỉ ghi lại những điều chung nhất cũng như các kĩ năng quan trọng cho việc tận dụng khả năng của máy và chỉ đề cập đến những đặc tính cá biệt cho từng loại văn lệnh khi cần thiết.

Bài viết đươc phân bổ theo chức năng BASH, mỗi bài có thể cần đến từ 4-6 tiết kể cả thực hành để hiểu và nắm bắt được nội dung.

Yêu cầu từ phía người đọc

Điều kiện tiên quyết để hiểu sâu tài liệu này là người đọc hiểu biết đầy đủ ít nhất một ngôn ngữ lập trình cơ bản. Trong nhiều trường hợp ngôn ngữ C/C++ sẽ được lấy ra để làm mốc so sánh. Bài giảng này cũng đòi hỏi người đọc có một số hiểu biết sơ đẳng về sử dụng hệ điều hành Linux, và biết được cách sử dụng các đầu cuối (terminal) để viết mã cho Linux - Tốt nhất là đã được học qua một khoá huấn luyện ngắn hạn về quản lý hệ điều hành Linux. Trong loạt bài này, đôi khi một số khái niệm hay thuật ngữ sẽ được đưa ra để minh định lại nội hàm của khái niệm đó nhằm chỉ rõ nghĩa mà các bài viết này dùng và nhằm tránh cho người đọc ngộ nhận hay nhầm lẫn với các khái niệm khác có thể có cùng tên. Ngoài ra, những thuật ngữ cơ bản về tin học cũng cần người đọc biết sẵn. Trong nhiều trường hợp khó khăn về thuật ngữ thì bài viết sẽ đưa vào từ gốc Anh ngữ trong lần đầu sử dụng và chúng được đặt trong ngoặc đơn cho người đọc tiện tra cứu thêm. Các thí dụ có thể được thử lại bằng cách gõ thẳng thành một dòng lệnh hay viết chúng vào trong các tập tin và chạy bằng cách dùng câu lệnh bash [tên_tập_tin] (Ở đây cần thay thế [tên_tập_tin] bởi tên thật của tập tin được thi hành).

Ngoài ra, để tiện cho người đọc tra cứu ở phần cuối của loạt bài sẽ có bảng từ vựng tham chiếu Anh-Việt trình bày tổng hợp các thuật ngữ Anh-Việt có dùng trong bài.

Các chú thích riêng cho từng bài sẽ được đánh dấu bởi các kí tự số (digit) và được ghi ra ở phần bị chú cuối mỗi bài.  1

Muốn cho việc hấp thu kiến thức có hiệu quả thì tất yếu là người đọc phải thực hiện việc viết mã nguồn, sửa lỗi và chạy chúng. Tuỳ theo khả năng, kinh nghiệm riêng người đọc có thể có tiến bộ nhanh hay chậm. Để tránh các rủi ro khi thực hành, một phương cách tốt là người học chỉ nên thi hành các mã thử nghiệm trên một thư mục riêng và giảm tối đa việc truy cập các lệnh có tính cách phá hủy ra ngoài thư mục thử nghiệm. Trong chừng mực nào đó, cần phải đi ra khỏi chỗ thử, thì phải rất cẩn thận vì mọi mệnh lệnh đều có thể gây hiệu ứng phụ của nó -- Một phương thức để bảo đảm phần nào an toàn cho việc làm này là thực thi các thủ tục làm bản sao dự phòng (backup) của máy.

Ngược lại, nhiều mệnh lệnh BASH đòi hỏi người dùng phải có quyền truy cập của 'root' (tức là admin tối cao) và như vậy càng phải đắn đo hơn trước khi chạy các lệnh này. Dĩ nhiên, một cách tuyệt đối an toàn là người dùng có riêng một máy được cài đặt Linux, và tiến hành tất cả các thử nghiệm trên đó mà không sợ hư hại. Mỗi khi có trục trặc không sửa được thì chỉ việc ... "xoá bàn cờ chơi lại từ đầu" . nghĩa là, cài đặt mới lại toàn bộ hệ thống Linux

Vì BASH là một hệ thống trình dịch khá phức tạp nên người đọc cần có thêm các tài liệu tra cứu về cú pháp các câu lệnh. Một tài liệu trực tuyến khá đầy đủ là "Bash Reference Manual" (có ghi trong phần tài liệu tham khảo). Tuy nhiên, trong hầu hết các trường hợp tra cứu lệnh hệ thống trong LINUX thì có thể thử gõ lệnh: man [TÊN_LỆNH] (hay info [TÊN_LỆNH] ) trực tiếp lên cửa sổ dòng lệnh.

Khái niệm về văn lệnh BASH

Văn Lệnh

Văn lệnh (script) là một chương trình máy tính thường được lưu giữ trong dạng tập tin văn bản thông thường (text file) trong đó có chứa các lệnh có thể thực hiện được từ một ứng dụng hay một tiện ích. Các câu lệnh này phải được trình bày đúng theo quy tắc cú pháp yêu cầu và sẽ được thực thi theo thứ tự trình bày đó khi máy thi hành tập tin.

Như vậy, để một văn lệnh có thể thực thi thì đòi hỏi các điều kiện sau:

Trên máy có ứng dụng hay tiện ích "hiểu" được nội dung của văn lệnh. Bản thân nội dung của tập văn lệnh phải thoả mãn các cú pháp câu lệnh yêu cầu bởi ứng dụng hay tiện ích nêu trong điểm trên. Sự thực thi của các câu lệnh sẽ theo trật tự trình bày tuỳ theo người viết mã cho văn lệnh.

Nhiều nơi đã dịch chữ "script" một cách không rõ nghĩa thành "kịch bản". Trong các bài giảng, chúng tôi sẽ chỉ sử dụng từ văn lệnh hay script; người đọc có nhiệm vụ phải hiểu các từ đồng nghĩa khác của nó.

Trong một hệ điều hành thường hỗ trợ bởi ít nhất một dạng văn lệnh thông qua một trình thông dịch. Thí dụ trong hệ thống Windows, thì có Windows Script Host sẽ hỗ trợ cho việc viết một văn lệnh đôi khi còn gọi là tập tin "batch" (*).

Trong Linux, khi nói đến script thì người ta thường nghĩ ngay đến các loại trình bao (shell) có khả năng đọc và thi hành trực tiếp các tập tin văn lệnh. Trình bao (shell) là các trình thông dịch (interpreter) giữ nhiệm vụ đọc và thi hành các lệnh ghi trong tập tin văn lệnh. Mặt khác các hệ điều hành thường hỗ trợ một trình bao chuẩn để giữ vai trò mốt lớp vỏ ngoài cung ứng một giao diện nhằm thực thi các chức năng và dịch vụ đươc yêu cầu trực tiếp từ người dùng. Khi dùng với ý nghĩa này thì shell có thể được dịch là "hệ vỏ".

BASH

BASH là một loại trình bao hay một trình thông dịch dùng cho các hệ điều hành có giấy phép GNU. BASH là chữ viết tắc của cụm từ "Bourne-Again SHell", được sáng tạo bởi Stephen Bourne.  2

Như vậy, một cách nôm na, văn lệnh BASH là các tập tin mã nguồn dùng để chạy được trong trình thông dịch BASH. Bởi vì tính tương thích cao của BASH nên hầu như mã nguồn nào viết trong "ngôn ngữ" của các loại trình bao Bourne, Korn, và C đều có thể chạy trong BASH  3

Khác với nhiều loại văn lệnh như là DOS Batch, Visual Basic, HTML; các loại văn lệnh trong Linux, trong đó có BASH và các văn lệnh mà nó tương thích, đều đặt nặng vấn đề viết hoa hay không. Nghĩa là, một biến tên "myVar" sẽ mặc định khác với biến có tên là "MyVar" hay "myvar". Đồng thời, ngoại trừ các loại biến toàn cục và các cài đặt đặc biệt, các câu hệnh hỗ trợ về lập trình trong các loại văn lệnh Linux đều không viết hoa (Tuy vậy. các tập tin văn lệnh mà người lập trình tạo ra có thể dùng bất kì tên hợp lệ nào. Nghĩa là việc đặt tên cho các văn lệnh viết hoa hay không tùy thuộc vào người tạo ra nó.

Các loại văn lệnh cơ bản và vai trò của chúng trong Linux

Khác với Windows, Linux là hệ điều hành hỗ trợ mạnh mẽ cách viết chương trình dạng văn lệnh.

Đối với người dùng

Hiểu và sử dụng rành mạch văn lệnh người dùng có thể:

  • Tham gia viết mã phát triển một số phần mềm đơn giản cho Linux từ việc viết một văn lệnh đơn giản dạng "autorun" cho các CDROM trong Linux cho đến việc thay đổi các thao tác cho người quản lý (admin) hay viết các chương trình có ý nghĩa riêng.
  • Hiểu và điều chỉnh được các phần cơ bản của văn lệnh khởi động (boot script)
  • Có thể tự tìm hiểu các đề án của Linux chẳng hạn như các đề án tự tạo các CDROM hay thanh USB tự khởi động được (bootable CD/ USB stick)
  • Làm nền tảng cơ bản để học và hiểu xa hơn về Linux như là việc tạo quản lí các gói rpm (-- viết tắt từ chữ Redhat Package Manager), tạo các tập tin kiến tạo (Makefile) dùng trong việc thiết kế các bộ điều vận.

Đối với Hệ Điều Hành Linux

Văn lệnh giữ vai trò chủ chốt trong hầu hết các hoạt động của của hệ điều hành như là:

  • Chạy các văn lệnh khởi động
  • Cung ứng một bộ lệnh hệ thống đầy đủ từ việc quản lý các tập tin, in ấn, email, nối mạng, xử lí văn bản cho đến việc đọc các cấu trúc thấp của máy tính như là tìm biết các PCI ID của các thiết bị. Tải (load) và dở bỏ (unload) các bộ điều vận (device driver), hay làm ra các tập tin kiến tạo (Makefile), các tập tin tài nguyên (resource file *rc) và các tác trìn (daemon4

Ngoài ra, hầu như tất cả các thao tác mà người dùng có thể gọi trong hệ thống giao diện đồ hoạ đều có thể gọi thẳng từ dạng lệnh hệ thống nên các thao tác này đều có thể được mã hoá và được điều khiển thi hành trưc tiếp dưới dạng một tập tin văn lệnnh

Các loại văn lệnh cơ bản trong Linux

Trong Linux có nhiều loại văn lệnh có thể sử dụng nhưng quan trong nhất là BASH kế đến loại trình dịch có tính năng mạnh được nhiều lập trình viên yêu thích là Korn. Những trình thông dịch lớn khác là TC và C.  5

Mụch đích của loạt bài

Các bài viết không ngoài mục đích truyền thụ lại các kĩ năng cơ bản cho người học và sử dụng Linux. Với kiến thức cơ bản này người đọc và hiểu có thể sử dụng cho công việc hàng ngày như thực tập viết các chương trình văn lệnh và có thể khởi sự phát triển các mã ban đầu cho Linux. Vì là lược giảng nên nội dung chỉ nhằm chỉ ra các sử dụng căn bản hay kiến thức cốt lõi quan trọng cho người đọc. Việc thấm sâu và sử dụng thành thục còn tùy theo sự kiên trì thực hành và căn cơ của từng người.

Cách Trình bày

Ngoại trừ bài 0 này, các bài khác đều bao gồm hai phần chính: Phần nội dung bài giảng đào sâu về mặt kiến thức, cú pháp, tính năng, và các thí dụ. Phần thứ hai quan trọng không kém là phần phụ lục (Tên gọi "phụ" ở đây không còn nguyên nghĩa như bản thân chữ này nữa -- hãy xem chữ này có vai trò tương tự như chữ phụ trong cụm "phụ nữ ngày nay" vậy :-) ) nhằm bổ xung kiến thức cơ bản về hệ thống kiến trúc, hoạt động, tính năng và các mệnh lệnh của Linux. Đối với các bạn đã quen với việc quản lý hệ thống Linux thì có thể chỉ cần lướt qua để ôn lại trong khi nếu là người mới thì tốt nhất là nên đọc hết các phần này. Việc đánh số thứ tự cho các chương cũng theo đó mà thay đổi. Ngoài ra, phần phụ lục sẽ được đánh số theo thứ tự riêng và luôn bắt đầu bằng chữ cái A.

Việc trình bày theo dạng "bổ ngang" của các phụ lục nhằm đáp ứng theo trình tự tìm hiểu sâu dần kiến thức liên quan đến hệ điều hành Linux và có thể ảnh hưởng áp dụng trực tiếp vào hiểu biết chính trong việc viết mã cho script. Các phụ lục này sẽ không cần thiết nếu người đọc đã sử dụng rành mạch các lệnh hệ thống của Linux cũng như hiểu rõ cấu trúc hoạt động của nó.

Những lưu ý quan trọng sẽ được tô màu để nhấn mạnh sự lưu ý của độc giả. Ngược lại, các câu viết bông đùa không chứa nhiều kiến thức trọng tâm lại có thể có màu xám lợt hơn màu mực in thường.

Hệ thống sắp xếp phân lớp theo thứ tự bằng cách đánh số. Các phân mục con sẽ được đánh số thứ tự và ngăn cách với số thứ tự của phân mục lớn hơn bởi dấu . (chấm)

Để giảm mức độ trừu tuợng cho người đọc, việc trình bày các cú pháp tổng quát sẽ được bổ túc hay thay thế bởi các thí dụ cụ thể. Các thí dụ này đã được kiểm nghiệm trước khi đưa vào bài và viết bằng font courier New, nhưng dĩ nhiên, có thể khó tránh khỏi các lỗi type. Để có thể đọc cú pháp các lệnh BASH đề nghị người đọc tự tìm hiểu qua các tài liệu tra cứu hay dùng lệnh man.

Ngoài ra, cần lưu ý các định danh (identifier) được viết trong ngoặc nhọn màu xám < > chỉ là các tên giả định để cho để hiểu khi thực hành cần được thay thế bởi các tên đúng tương ứng với tính chất của biểu thức đòi hỏi.

Các tài liệu bổ xung

Đối với các bạn nào muốn đọc thêm các tài liệu để có kiến thức cơ bản về cách viết văn lệnh BASH cũng như là một số kiến thức về quản trị hệ thống Linux (và để hiểu rõ các mã thí dụ hay các câu lệnh (command/instruction) viết trong bài có thể tự xem thêm một số bài viết sau.):

  • Vivek G. Gite. 2000-2002. Linux Shell Scripting Tutorial v1.05r3 -A Beginner's handbook
  • William Shotts, Jr. 2000-2006 LinuxCommand.Org - Your one stop command line shop
  • David Tarsi 2002-2006 Linux Command Reference Index
  • Unix system Support Group - Indiana University. Unix System Administration Independent Learning.
  • http://www.uwsg.indiana.edu/usail/

Ngoài ra, trong Tài Liệu tham khảo ở cuối loạt bài cũng có các tài liệu nhưng đòi hỏi người đọc ở mức cao hơn. Tuy nhiên, đối với các bạn đã biết ít nhiều về sử dụng mệnh lệnh trong Linux thì không cần phải đọc qua các văn bản sơ bản trên. Tra cứu về các mệnh lệnh của BASH có thể tìm thấy ở GNU.org: "Bash Reference Manual"

Bài đọc thêm bằng Anh ngữ

Chú thích

1:  Chữ Batch đôi khi được dịch nghĩa là "lô" nhưng nghĩa chính xác hơn là "khối xử lý" hay "nhóm các quá trình"

2:  Xem thêm The History of the Shell từ Trang nhà của RedHat

3:  Có một số trường hợp không tương thích mã giữa BASH và các trình bao khác đặc biệt là một vài tính năng mạnh về lập trình (như trường hợp dùng lệnh "print") có trong Korn nhưng không được hỗ trợ trong BASH

4:  Chữ daemon, được một số nơi dịch là "trình nền". Nó là các chương trình thường được viết bằng nhiều loại ngôn ngữ (mà tập tin khởi động của "trình nền" này là các văn lệnh với tên thường có kết thúc bằng kí tự "d" được lưu bên trong /et/c/init.d). Các chương trình này thường được tải thường trực trong bộ nhớ và được gọi ra dùng khi có yêu cầu. Chúng tương đương với các service (dịch vụ) của hệ điều hành Windows. Do đó, đúng hơn là dịch thuật ngữ này thành tác trình hay trình dịch vụ để tránh nhầm lẫn với các trình chạy trong nền khác mà không phải là daemon. Một điều khác là người dùng có thể gọi lệnh để hạ nó xuống khỏi bộ nhớ hay tải nó lên bằng cách gọi một trong các lệnh:

[TÊN_DAEMON] stop , [TÊN_DAEMON] start , hay [TÊN_DAEMON] restart .

Trong bài 4A chúng ta sẽ tìm hiểu đào sâu về cách tạo ra các tác trình này.

5:  C ở đây là "C shell" một trình thông dịch không phải là ngôn ngữ C, thứ ngôn ngữ trình biên dịch mà các SV năm thứ 1-2 được học


Trở về mục lục

Đọc bài kế

Liên kết đến đây