Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux/Bài 0
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
Mục lục
Dẫn Nhập[sửa]
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[sửa]
Đ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[sửa]
Văn Lệnh[sửa]
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[sửa]
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[sửa]
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[sửa]
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[sửa]
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 (daemon) 4
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[sửa]
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[sửa]
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[sửa]
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[sửa]
Đố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ữ[sửa]
Chú thích[sửa]
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