Tìm hiểu Linux, 101: Dòng lệnh Linux

Thoải mái sử dụng các lệnh GNU và UNIX

Các giao diện người dùng đồ họa (GUI) là tốt, nhưng để giải phóng hết sức mạnh thực sự của Linux®, thì không có gì thay thế được dòng lệnh. Trong bài này, Ian Shields giới thiệu cho bạn một số tính năng chính của bash shell, nhấn mạnh vào các tính năng quan trọng cho chứng chỉ LPI. Đến cuối bài viết này, bạn sẽ thoải mái sử dụng các lệnh Linux cơ bản như echo và exit, thiết lập các biến môi trường và thu thập thông tin hệ thống. [Hai chú ý đầu tiên sau Liệt kê 8 đã được cập nhật để hiệu chỉnh các mã nhận dạng tiến trình (PID). -Người biên tập.]

Ian Shields, Lập trình viên cao cấp, EMC

Ian Shields làm việc cho rất nhiều dự án Linux trên vùng Linux của developerWorks. Ông là một lập trình viên cao cấp của IBM tại Khu vực Tam giác nghiên cứu (Research Triangle Park - RTP), bang Bắc Carolina (NC). Ông đã đến với IBM ở Canberra, Úc, như là một kỹ sư hệ thống vào năm 1973, và từ đó đã làm việc về các hệ thống thông tin liên lạc và điện toán mọi nơi tại Montreal, Canada, và RTP, NC. Ông đã có một số bằng sáng chế và đã xuất bản một số bài báo. Ông tốt nghiệp đại học ngành toán học thuần tuý và triết học tại Đại học Quốc gia Úc. Ông có bằng thạc sĩ và tiến sĩ khoa học máy tính của Đại học Bắc Carolina.



31 08 2009 (Xuất bản lần đầu tiên vào ngày 10 09 2010)

Về loạt bài này

Loạt bài này sẽ giúp bạn tìm hiểu các nhiệm vụ quản trị hệ thống Linux. Bạn cũng có thể sử dụng những tư liệu trong những bài viết này để chuẩn bị cho các kỳ thi trình độ 1 (LPIC-1) chứng chỉ của Viện Linux chuyên nghiệp (Linux Professional Institute).

Xem lộ trình của loạt bài của chúng tôi để thấy mô tả và lấy đường liên kết đến mỗi bài viết trong loạt bài này. Lộ trình này đang tiếp diễn và phản ánh các mục tiêu mới nhất (tháng 4 năm 2009) của kỳ thi LPIC-1: khi chúng tôi hoàn thành các bài viết, chúng tôi sẽ thêm chúng vào lộ trình này. Trong khi chờ đợi, các bạn có thể tìm thấy các phiên bản trước đó của tài liệu tương tự, hỗ trợ các mục tiêu LPIC-1 có trước tháng 4 năm 2009, trong các hướng dẫn chuẩn bị kỳ thi lấy chứng chỉ LPI của chúng tôi.

Điều kiện cần có trước

Để thu nhận được nhiều nhất từ các bài viết trong loạt bài này, bạn cần phải có một kiến thức cơ bản về Linux và một hệ thống Linux đang làm việc, trong đó bạn có thể thực hành các lệnh trình bày trong bài viết này. Đôi khi các phiên bản khác nhau của một chương trình sẽ định dạng kết quả đầu ra khác nhau, vì thế kết quả của bạn có thể không phải luôn luôn chính xác giống hệt như các liệt kê và các hình minh họa được hiển thị ở đây.

Tổng quan

Bài viết này cung cấp cho bạn một giới thiệu ngắn gọn về một số tính năng chính của bash shell và trình bày các chủ đề sau:

  • Tương tác với các shell và các lệnh bằng cách sử dụng dòng lệnh.
  • Sử dụng các lệnh và các dãy lệnh hợp lệ.
  • Định nghĩa, sửa đổi, tham khảo và xuất khẩu các biến môi trường.
  • Truy cập lược sử lệnh và các tiện ích chỉnh sửa.
  • Gọi các lệnh trong đường dẫn và ngoài đường dẫn.
  • Sử dụng các trang hướng dẫn (man) để tìm hiểu về các lệnh.

Bài viết này giúp bạn chuẩn bị cho Mục tiêu 103.1 trong Chủ đề 103 của kì thi 101 (LPIC-1) quản trị trình độ sơ cấp (Junior Level Administration (LPIC-1) exam 101). Mục tiêu này có trọng số là 4. Các tư liệu trong bài viết này tương ứng với các mục tiêu cho kỳ thi 101 tháng 4 năm 2009. Bạn nên thường xuyên tham khảo các mục tiêu để biết các yêu cầu cuối cùng.


bash shell

bash shell là một trong nhiều shell có sẵn cho Linux. Nó còn được gọi là shell dựa theo Bourne (Bourne-again shell), sau khi Stephen Bourne, người sáng tạo ra một shell trước đó (/bin/sh). Về cơ bản bash tương thích với sh, nhưng nó cung cấp nhiều cải tiến về cả chức năng lẫn khả năng lập trình. Nó kết hợp các tính năng từ Korn shell (ksh) và C shell (csh) và được dự kiến là một shell tuân thủ theo POSIX.

Trước khi chúng ta xoáy sâu hơn vào bash, hãy nhớ lại rằng một shell là một chương trình chấp nhận và thi hành các lệnh. Nó cũng hỗ trợ các cấu trúc lập trình, cho phép xây dựng các lệnh phức tạp từ các phần nhỏ hơn. Các lệnh phức tạp này, còn gọi là các kịch bản lệnh (scripts), có thể được lưu như các tập tin để trở thành các lệnh mới, với tư cách riêng. Thật vậy, nhiều lệnh trên một hệ thống Linux điển hình thực sự các kịch bản lệnh.

Các shell có một số lệnh dựng sẵn, chẳng hạn như cd, break, và exec. Các lệnh khác là lệnh ngoài.

Các shell cũng sử dụng ba luồng (streams) Vào/Ra (I/O) tiêu chuẩn:

  • stdinluồng đầu vào tiêu chuẩn, cung cấp đầu vào cho các lệnh.
  • stdoutluồng đầu ra tiêu chuẩn, hiển thị đầu ra từ các lệnh.
  • stderrluồng lỗi tiêu chuẩn, hiển thị đầu ra lỗi từ các lệnh.

Các luồng đầu vào cung cấp đầu vào cho các chương trình, thường là từ gõ bàn phím đầu cuối. Các luồng đầu ra in các ký tự văn bản, thường là tới một đầu cuối. Thiết bị đầu cuối ban đầu là một máy đánh chữ ASCII hoặc màn hình hiển thị, nhưng bây giờ nó thường là một cửa sổ trên màn hình nền đồ họa. Chi tiết hơn nữa về cách chuyển hướng các luồng I/O tiêu chuẩn này sẽ được trình bày trong một bài viết khác trong loạt bài này.

Đối với phần còn lại của bài viết này, chúng tôi sẽ giả định bạn biết cách để có được một dấu nhắc shell. Nếu bạn chưa biết, bài viết "Các nhiệm vụ cơ bản cho các nhà phát triển Linux mới" (Basic tasks for new Linux developers) của developerWorks sẽ cho bạn biết cách thực hiện được điều này và hơn thế nữa.

Nếu bạn đang sử dụng một hệ thống Linux mà không dùng màn hình nền đồ họa hoặc nếu bạn mở một cửa sổ đầu cuối trên màn hình nền đồ họa, bạn sẽ được chào đón bằng một dấu nhắc, có lẽ giống như một dấu nhắc được hiển thị trong Liệt kê 1.

Liệt kê 1. Một số các dấu nhắc của người sử dụng điển hình
[db2inst1@echidna db2inst1]$ 
ian@lyrebird:~> 
$

Nếu bạn đăng nhập như là người dùng root (hoặc siêu người dùng - superuser), dấu nhắc của bạn có thể trông giống như được hiển thị trong Liệt kê 2.

Liệt kê 2. Các ví dụ về dấu nhắc của người dùng root hoặc superuser
[root@echidna ~]# 
lyrebird:~ # 
#

Người dùng root có quyền lực lớn, vì vậy hãy sử dụng nó cẩn thận. Khi bạn có các đặc quyền root, thì hầu hết các dấu nhắc có một dấu (#) ở đuôi. Các đặc quyền của người dùng bình thường luôn được đánh dấu bằng một kí tự khác, thường là một dấu hiệu đồng đô la ($). Thực tế dấu nhắc của bạn có thể trông khác so với các ví dụ trong bài viết này. Dấu nhắc của bạn có thể bao gồm tên người dùng, tên máy của bạn, thư mục hiện tại, ngày tháng hoặc thời gian mà dấu nhắc đó được in ra và v.v.

Các bài viết này bao gồm các ví dụ mã nguồn được cắt và dán từ các hệ thống Linux thực, sử dụng các dấu nhắc mặc định cho các hệ thống đó. Các dấu nhắc root của chúng ta có một dấu # ở đuôi, do đó bạn có thể phân biệt chúng với các dấu nhắc của người dùng bình thường, có dấu $ ở đuôi. Quy ước này phù hợp với nhiều sách viết về đề tài này. Nếu có một cái gì đó không chạy trong các ví dụ, hãy kiểm tra dấu nhắc.


Các lệnh và các dãy lệnh

Vậy là bây giờ bạn đã có một dấu nhắc, chúng ta hãy xem bạn có thể làm gì với nó. Chức năng chính của shell là để thông dịch các lệnh của bạn sao cho bạn có thể tương tác với hệ thống Linux của mình. Trên các hệ thống Linux (và UNIX ®), các lệnh có một tên lệnh và sau đó là các tùy chọncác tham số. Một số lệnh có cái này nhưng không có cái kia.

Nếu một dòng chứa một ký tự #, thì tất cả các ký tự còn lại trên dòng đó được bỏ qua. Vì vậy, một ký tự # có thể chỉ báo một lời bình luận cũng như một dấu nhắc root. Nó là cái gì sẽ rõ ràng từ ngữ cảnh.

Lệnh echo

Lệnh echo in lại (hay dội trả lại) các đối số của nó tới thiết bị đầu cuối như trong Liệt kê 3.

Liệt kê 3. Các ví dụ về lệnh echo
[ian@echidna ~]$ echo Word 
Word 
[ian@echidna ~]$ echo A phrase 
A phrase 
[ian@echidna ~]$ echo Where   are   my   spaces? 
Where are my spaces?
[ian@echidna ~]$ echo "Here   are   my   spaces." # plus comment 
Here   are   my   spaces.

Trong ví dụ thứ ba của Liệt kê 3, tất cả các khoảng trống thừa được nén thành một khoảng trống duy nhất ở đầu ra. Để tránh điều này, bạn cần phải đặt các chuỗi ký tự trong cặp dấu nháy kép (") hoặc dấu nháy đơn ('). Bash sử dụng khoảng trống, ví dụ như ký tự để trống, dấu tab và ký tự xuống dòng mới, để tách dòng đầu vào của bạn thành các thẻ (token), rồi chuyển tới lệnh của bạn. Việc đặt các chuỗi ký tự trong cặp dấu nháy sẽ bảo tồn khoảng trống dư thừa và làm cho toàn bộ chuỗi ký tự thành một thẻ duy nhất. Trong ví dụ trên, mỗi thẻ sau tên lệnh là một tham số, do đó chúng ta lần lượt có các tham số 1, 2, 4 và 1.

Lệnh echo có một vài tùy chọn. Thông thường lệnh echo sẽ nối thêm một ký tự xuống dòng mới vào đuôi của kết quả đầu ra. Sử dụng tùy chọn -n để loại bỏ điều này. Sử dụng tùy chọn -e để cho phép một số ký tự nhất định được áp mã thoát là dấu gạch chéo ngược có ý nghĩa riêng đặc biệt. Một số trong các ký tự này được hiển thị trong Bảng 1.

Bảng 1. Các ký tự có mã thoát và lệnh echo
Dãy lệnh thoátChức năng
\aCảnh báo (chuông)
\bLùi một vị trí
\cLoại bỏ ký tự xuống dòng mới ở đuôi (cùng chức năng như tùy chọn -n)
\fIn ra và bắt đầu một trang mới (xóa màn hình trên màn hiển thị video)
\nDòng mới
\rXuống dòng
\tDấu tab ngang

Mã thoát và tiếp tục dòng

Có một vấn đề nhỏ nảy sinh ra khi sử dụng các dấu gạch chéo ngược trong bash. Khi ký tự dấu gạch chéo ngược (\) không đặt trong dấu nháy, nó có tác dụng như một lệnh thoát để báo hiệu cho chính bash giữ nguyên ý nghĩa nguyên văn của ký tự tiếp theo. Điều này là cần thiết cho các siêu ký tự (metacharacter) của shell đặc biệt mà chúng ta sẽ trình bày ngay sau đây. Có một trường hợp ngoại lệ với quy tắc này: một dấu gạch chéo ngược tiếp theo là một dấu dòng mới làm cho bash nuốt cả hai ký tự và xử lý dãy như một yêu cầu tiếp tục dòng. Điều này rất tiện lợi để ngắt các dòng dài, đặc biệt là trong các kịch bản lệnh của shell.

Để cho các dãy mô tả trên được xử lý đúng bởi lệnh echo hay các lệnh khác có sử dụng các ký tự điều khiển với mã thoát tương tự, bạn phải đưa dãy mã thoát vào trong cặp dấu nháy hoặc là một phần của một chuỗi ký tự được đặt trong cặp dấu nháy, trừ khi bạn sử dụng một dấu gạch chéo ngược thứ hai để buộc shell giữ nguyên nó dành cho lệnh xử lý. Liệt kê 4 cho thấy một số ví dụ về cách sử dụng khác nhau của dấu \.

Liệt kê 4. Thêm các ví dụ về echo
[ian@echidna ~]$ echo -n No new line 
No new line
[ian@echidna ~]$ echo -e "No new line\c" 
No new line
[ian@echidna ~]$ echo "A line with a typed
> return" 
A line with a typed 
return 
[ian@echidna ~]$ echo -e "A line with an escaped\nreturn" 
A line with an escaped return 
[ian@echidna ~]$ echo "A line with an escaped\nreturn but no -e option" 
A line with an escaped\nreturn but no -e option 
[ian@echidna ~]$ echo -e Doubly escaped\\n\\tmetacharacters 
Doubly escaped metacharacters 
[ian@echidna ~]$ echo Backslash \ 
> followed by newline \ 
> serves as line continuation. 
Backslash followed by newline serves as line continuation.

Lưu ý rằng bash hiển thị một dấu nhắc đặc biệt (>) khi bạn gõ một dòng với các dấu nháy không phù hợp. Chuỗi đầu vào của bạn tiếp tục ở trên dòng thứ hai và có chứa một ký tự dòng mới.

Các siêu ký tự của bash shell và các toán tử điều khiển

Bash có một vài siêu ký tự, khi không được đặt trong dấu nháy, cũng được dùng để chia đầu vào thành các từ. Bên cạnh một khoảng trống, chúng là:

  • |
  • &
  • ;
  • (
  • )
  • <
  • >

Chúng ta sẽ thảo luận chi tiết hơn một số trong các siêu ký tự này trong các phần khác của bài viết này. Bây giờ, lưu ý rằng nếu bạn muốn có một siêu ký tự như là một phần của văn bản của bạn, thì nó hoặc phải được đặt trong dấu nháy hoặc áp mã thoát bằng cách dùng một dấu gạch chéo ngược (\) như trong Liệt kê 4.

Các dòng mới và các siêu ký tự nhất định nào đó hoặc các cặp siêu ký tự cũng được dùng như là các toán tử điều khiển. Đó là:

  • ||
  • &&
  • &
  • ;
  • ;;
  • |
  • (
  • )

Một số trong các toán tử điều khiển này cho phép bạn tạo các dãy hoặc các danh sách của các lệnh.

Dãy lệnh đơn giản nhất chỉ là hai lệnh được phân cách nhau bằng dấu chấm phẩy (;). Mỗi lệnh được thực thi theo thứ tự. Trong bất kỳ môi trường lập trình nào, các lệnh trả về một biểu thị thành công hay thất bại; các lệnh Linux thường trả về một giá trị bằng không khi thành công và một giá trị khác không cho trường hợp thất bại. Bạn có thể đưa vào thêm một số xử lý có điều kiện trong danh sách của bạn bằng cách sử dụng các toán tử điều khiển && và ||. Nếu bạn tách hai lệnh bằng toán tử điều khiển && thì lệnh thứ hai được thực hiện khi và chỉ khi lệnh thứ nhất trả về mã kết thúc (exit) bằng không. Nếu bạn tách các lệnh bằng ||, thì lệnh thứ hai được thực hiện chỉ khi lệnh thứ nhất trả về một mã kết thúc khác không. Liệt kê 5 cho thấy một số dãy lệnh khi sử dụng lệnh echo. Các dãy này chưa thực sự thú vị do lệnh echo trả về 0, nhưng bạn sẽ thấy nhiều ví dụ sau này, khi chúng ta có thêm vài lệnh để sử dụng.

Liệt kê 5. Các dãy lệnh
[ian@echidna ~]$ echo line 1;echo line 2; echo line 3 
line 1 
line 2 
line 3 
[ian@echidna~]$ echo line 1&&echo line 2&&echo line 3 
line 1 
line 2 
line 3 
[ian@echidna ~]$ echo line 1||echo line 2; echo line 3 
line 1 
line 3

Lệnh Exit

Bạn có thể kết thúc một shell bằng cách sử dụng lệnh exit (thoát ra). Bạn có thể tùy ý đưa ra một mã exit như là một tham số. Nếu bạn đang chạy shell của mình trong một cửa sổ đầu cuối trên một màn hình nền đồ họa, cửa sổ của bạn sẽ đóng. Tương tự như vậy, nếu bạn đã kết nối tới một hệ thống từ xa bằng cách sử dụng ssh hoặc telnet (ví dụ thế), kết nối của bạn sẽ chấm dứt. Trong bash shell, bạn cũng có thể giữ phím Ctrl và nhấn phím d để thoát ra.

Hãy xem một toán tử điều khiển khác. Nếu bạn bao bọc một lệnh hoặc một danh sách lệnh trong các dấu ngoặc đơn, thì lệnh hay trình tự đó được thực thi trong một shell con, như vậy lệnh exit thoát ra khỏi shell con chứ không phải thoát khỏi shell bạn đang làm việc với nó. Liệt kê 6 cho thấy một ví dụ đơn giản liên quan đến && và || và hai mã exit khác nhau.

Liệt kê 6. Các shell con và dãy lệnh
[ian@echidna ~]$ (echo In subshell; exit 0) && echo OK || echo Bad exit 
In subshell 
OK 
[ian@echidna ~]$ (echo In subshell; exit 4) && echo OK || echo Bad exit 
In subshell 
Bad exit

Hãy theo sát để biết nhiều dãy lệnh hơn nữa ở phần sau trong bài viết này.


Các biến môi trường

Khi bạn đang chạy trong một bash shell, có nhiều thứ tạo nên môi trường của bạn, chẳng hạn như hình dạng của dấu nhắc của bạn, thư mục nhà của bạn, thư mục làm việc của bạn, tên của shell của bạn, các tập tin bạn đã mở, các chức năng mà bạn đã xác định và v.v. Môi trường của bạn bao gồm nhiều biến. Các biến này có thể do bash hay do bạn thiết lập. Bash shell cũng cho phép bạn có các biến shell và bạn có thể xuất khẩu các biến đó sang môi trường của bạn để cho các tiến trình khác đang chạy trong shell sử dụng hoặc cho các shell khác do bạn có thể tạo ra từ shell hiện hành sử dụng.

Cả các biến môi trường lẫn các biến shell có một tên (name). Bạn tham khảo giá trị của một biến bằng cách thêm dấu '$' vào trước tên của nó. Một số biến môi trường bash chung mà bạn sẽ bắt gặp được chỉ ra trong Bảng 2.

Bảng 2. Một số biến môi trường bash chung
TênChức năng
USERTên của người dùng đã đăng nhập.
UIDSố nhận dạng người dùng của người dùng đã đăng nhập.
HOMEThư mục nhà của người dùng.
PWDThư mục làm việc hiện tại.
SHELLTên của shell.
$Số nhận dạng tiến trình (hay PID) của tiến trình bash shell (hoặc tiến trình khác) đang chạy.
PPIDSố nhận dạng tiến trình của tiến trình đã bắt đầu tiến trình này (tức là, số nhận dạng của tiến trình cha mẹ).
?Mã exit của lệnh cuối cùng.

Liệt kê 7 hiển thị bạn có thể thấy những gì trong một số các biến bash chung này.

Liệt kê 7. Môi trường và các biến shell
[ian@echidna ~]$ echo $USER $UID 
ian 500 
[ian@echidna ~]$ echo $SHELL $HOME $PWD 
/bin/bash /home/ian /home/ian 
[ian@echidna ~]$ (exit 0);echo $?;(exit 4);echo $? 
0 
4 
[ian@echidna ~]$ echo $$ $PPID 
2559 2558

Không sử dụng bash?

Bash shell là shell mặc định trong hầu hết các bản phân phối Linux. Nếu bạn không chạy trong bash shell, bạn có thể muốn xem xét một trong những cách sau đây để thực hành với bash shell.

  • Sử dụng
    chsh -s /bin/bash
    lệnh để thay đổi shell mặc định của bạn. Shell mặc định này sẽ có hiệu lực trong lần tới khi bạn đăng nhập.
  • Sử dụng
    su - $USER -s /bin/bash
    lệnh để tạo ra một tiến trình khác như một shell con trong shell hiện tại của bạn. Tiến trình mới sẽ là một shell đăng nhập, sử dụng bash.
  • Tạo một mã nhận dạng (id) với mặc định là của một bash shell để sử dụng cho việc chuẩn bị kỳ thi LPI.

Bạn có thể tạo hoặc thiết lập một biến shell bằng cách gõ tên, ngay sau đó là một dấu bằng (=). Nếu biến đó tồn tại, bạn sẽ sửa đổi nó để gán giá trị mới. Các biến có phân biệt dạng chữ hoa chữ thường, do đó var1 và VAR1 là các biến khác nhau. Theo quy ước, các biến, đặc biệt là các biến xuất khẩu, là biến chữ hoa, nhưng đây không phải là một yêu cầu bắt buộc. Về mặt kỹ thuật, $$ và $? là các tham số shell hơn là các biến. Chúng chỉ có thể được tham chiếu; bạn không thể gán một giá trị cho chúng.

Khi bạn tạo một biến shell, bạn thường sẽ muốn export nó đến môi trường để cho nó sẽ có sẵn cho các tiến trình khác mà bạn khởi đầu các tiến trình ấy từ shell này. Các biến mà bạn xuất khẩu không có sẵn đối với một shell cha mẹ. Bạn sử dụng lệnh export để xuất khẩu một tên biến. Như một phím tắt trong bash, bạn có thể gán một giá trị và xuất khẩu một biến trong một bước.

Để minh họa việc gán và xuất khẩu, chúng ta hãy chạy lệnh bash shell khi ở trong bash shell và sau đó chạy Korn shell (ksh) từ bash shell mới. Chúng ta sẽ sử dụng lệnh ps để hiển thị thông tin về lệnh đang chạy. Chúng ta sẽ tìm hiểu thêm về ps trong một bài viết khác trong loạt bài này. (Xem Tài nguyên về lộ trình của loạt bài này).

Liệt kê 8. Thêm các biến môi trường và các biến shell
[ian@echidna ~]$ ps -p $$ -o "pid ppid cmd" 
  PID PPID CMD 
 2559 2558 -bash 
[ian@echidna ~]$ bash 
[ian@echidna ~]$ ps -p $$ -o "pid ppid cmd" 
 PID PPID CMD 
2811 2559 bash 
[ian@echidna ~]$ VAR1=var1
[ian@echidna ~]$ VAR2=var2 
[ian@echidna ~]$ export VAR2 
[ian@echidna ~]$ export VAR3=var3 
[ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 
var1 var2 var3 
[ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 $SHELL 
var1 var2 var3 /bin/bash
[ian@echidna ~]$ ksh 
$ ps -p $$ -o "pid ppid cmd" 
  PID PPID CMD 
 2840 2811 ksh 
$ export VAR4=var4 
$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL 
var2 var3 var4 /bin/bash 
$ exit 
[ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL 
var1 var2 var3 /bin/bash 
[ian@echidna ~]$ ps -p $$ -o "pid ppid cmd" 
  PID PPID CMD 
 2811 2559 bash 
[ian@echidna ~]$ exit 
exit
[ian@echidna ~]$ ps -p $$ -o "pid ppid cmd" 
  PID PPID CMD 
 2559 2558 -bash
[ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL 
/bin/bash

Lưu ý:

  1. Lúc bắt đầu dãy lệnh này, bash shell có PID 2559.
  2. Bash shell thứ hai có PID 2811 và shell cha mẹ của nó là PID 2559, đó là bash shell ban đầu.
  3. Chúng ta tạo ra các biến VAR1, VAR2 và VAR3 trong bash shell thứ hai, nhưng chỉ xuất khẩu biến VAR2 và VAR3.
  4. Trong Korn shell, chúng ta tạo ra biến VAR4. Lệnh echo chỉ hiển thị các giá trị cho các biến VAR2, VAR3 và VAR4, điều này xác nhận rằng biến VAR1 đã không được xuất khẩu. Bạn có ngạc nhiên không khi thấy rằng giá trị của biến SHELL đã không thay đổi, mặc dù dấu nhắc đã thay đổi? Bạn không thể luôn dựa vào SHELL để cho bạn biết bạn đang chạy trong shell nào, nhưng lệnh ps sẽ nói cho bạn biết lệnh hiện tại. Lưu ý rằng ps đặt một dấu nối (-) ở phía trước của bash shell đầu tiên để báo hiệu rằng đây là shell đăng nhập.
  5. Quay lại bash shell thứ hai, chúng ta có thể nhìn thấy các biến VAR1, VAR2 và VAR3.
  6. Và cuối cùng, khi chúng ta quay trở lại shell ban đầu, không có biến nào trong số các biến mới của chúng ta còn tồn tại.

Các cuộc thảo luận trước đó về việc đặt các dấu nháy nói rằng bạn có thể sử dụng hoặc dấu nháy đơn hoặc dấu nháy kép. Có một sự khác biệt quan trọng giữa chúng. Shell chỉ khai triển các biến shell nằm giữa các dấu nháy kép ($quot;), nó không khai triển nếu sử dụng dấu nháy đơn ('). Trong ví dụ trước, chúng ta bắt đầu một shell khác bên trong shell của chúng ta và chúng ta đã nhận được một mã nhận dạng tiến trình mới. Khi sử dụng tùy chọn -c, bạn có thể chuyển một lệnh tới shell khác để nó thực hiện lệnh và trả về. Nếu bạn chuyển một chuỗi ký tự đặt trong dấu nháy như là một lệnh, shell bên ngoài của bạn sẽ loại bỏ các dấu nháy và chuyển tiếp chuỗi ký tự đi. Nếu dấu nháy kép được sử dụng, các biến được khai triển trước khi chuỗi ký tự được chuyển đi, nên kết quả có thể không được như bạn mong đợi. Shell và lệnh sẽ chạy trong tiến trình khác nên chúng sẽ có một mã nhận dạng tiến trình (PID) khác. Liệt kê 9 minh họa các khái niệm này. PID của bash shell cấp cao nhất được tô đậm.

Liệt kê 9. Đặt dấu nháy và các biến shell
[ian@echidna ~]$ echo "$SHELL" '$SHELL' "$$" '$$' 
/bin/bash $SHELL 2559 $$ 
[ian@echidna ~]$ bash -c "echo Expand in parent $$ $PPID"
Expand in parent 2559 2558 
[ian@echidna ~]$ bash -c 'echo Expand in child  $$ $PPID' 
Expand in child 2845 2559

Cho đến nay, mọi tham khảo biến của chúng ta đã kết thúc bằng khoảng trắng, vì thế tên biến kết thúc ở đâu là rõ ràng. Thực vậy, các tên biến chỉ gồm các chữ cái, chữ số hoặc ký tự gạch dưới. Shell biết rằng một tên biến kết thúc ở nơi tìm thấy ký tự khác. Đôi khi bạn cần sử dụng các biến trong các biểu thức mà ở đó ý nghĩa có thể mập mờ. Trong trường hợp này, bạn có thể sử dụng các dấu ngoặc móc ({}) để phân định tên biến như trong Liệt kê 10.

Liệt kê 10. Sử dụng dấu ngoặc ôm với các tên biến
[ian@echidna ~]$ echo "-$HOME/abc-" 
-/home/ian/abc-
[ian@echidna ~]$ echo "-$HOME_abc-" 
-- 
[ian@echidna ~]$ echo "-${HOME}_abc-" 
-/home/ian_abc-

Lệnh Env

Lệnh env không có bất kỳ tuỳ chọn hoặc các tham số nào sẽ hiển thị các biến môi trường hiện tại. Bạn cũng có thể sử dụng nó để thực thi một lệnh trong một môi trường tùy chỉnh. Tùy chọn -i (hoặc chỉ cần -) xóa môi trường hiện tại trước khi chạy lệnh, trong khi tùy chọn -u bỏ các thiết lập biến môi trường mà bạn không muốn chuyển đi.

Liệt kê 11 cho thấy một phần kết quả đầu ra của lệnh env mà không có bất kỳ tham số nào và sau đó là ba ví dụ về cách gọi các shell khác nhau không có môi trường cha mẹ. Hãy xem xét cẩn thận những điều này trước khi chúng ta thảo luận về chúng.

Lưu ý: Nếu hệ thống của bạn không cài đặt các shell ksh (Korn) hoặc tcsh, thì bạn sẽ cần phải cài đặt chúng để tự mình làm những bài tập này.

Liệt kê 11. Lệnh env
[ian@echidna ~]$ env 
HOSTNAME=echidna 
SELINUX_ROLE_REQUESTED= 
TERM=xterm 
SHELL=/bin/bash
HISTSIZE=1000 
SSH_CLIENT=9.27.206.68 1316 22 
SELINUX_USE_CURRENT_RANGE=
QTDIR=/usr/lib/qt-3.3 
QTINC=/usr/lib/qt-3.3/include 
SSH_TTY=/dev/pts/3 USER=ian 
...
_=/bin/env 
OLDPWD=/etc 
[ian@echidna ~]$ env -i bash -c 'echo $SHELL; env'
/bin/bash 
PWD=/home/ian 
SHLVL=1 
_=/bin/env 
[ian@echidna ~]$ env -i ksh -c 'echo $SHELL; env' 
/bin/sh 
_=/bin/env 
PWD=/home/ian 
_AST_FEATURES=UNIVERSE - ucb
[ian@echidna ~]$ env -i tcsh -c 'echo $SHELL; env' 
SHELL: Undefined variable.

Nhận thấy rằng bash đã đặt biến SHELL, nhưng không xuất khẩu nó đến môi trường, mặc dù có ba biến khác do bash đã tạo ra trong môi trường đó. Trong ví dụ ksh, chúng ta có hai biến môi trường, nhưng nỗ lực của chúng ta để nhận lại giá trị của biến SHELL chỉ cho một dòng trống. Cuối cùng, tcsh đã không tạo ra bất kỳ biến môi trường nào và đưa ra một lỗi khi ta cố gắng tham khảo giá trị của SHELL.

Bỏ thiết lập và thiết lập

Liệt kê 11 cho thấy hành vi khác nhau trong cách các shell xử lý các biến và các môi trường. Trong khi bài viết này tập trung vào bash, nên biết rằng không phải tất cả shell hành xử theo cùng một cách giống nhau. Hơn nữa, các shell hành xử theo một cách khác nhau tùy theo chúng có là một shell đăng nhập hay không. Bây giờ, chúng ta sẽ chỉ có thể nói rằng một shell đăng nhập là shell mà bạn nhận được khi bạn đăng nhập vào hệ thống; bạn có thể bắt đầu các shell khác để vận hành như shell đăng nhập nếu bạn muốn. Ba shell bắt đầu ở trên bằng cách sử dụng env -i không phải là các shell đăng nhập. Hãy thử thêm tùy chọn -l vào chính lệnh shell để thấy những sự khác nhau mà bạn sẽ nhận được với một shell đăng nhập.

Vậy thì chúng ta hãy xem xét nỗ lực của chúng ta để hiển thị giá trị của biến SHELL trong các shell không đăng nhập:

  1. Khi bash bắt đầu, nó thiết lập biến SHELL, nhưng nó đã không tự động xuất khẩu biến này tới môi trường.
  2. Khi ksh bắt đầu, nó đã không thiết lập biến SHELL. Tuy nhiên, việc tham khảo một biến môi trường chưa được định nghĩa là tương đương với việc tham khảo một biến có một giá trị rỗng.
  3. Khi tcsh bắt đầu, nó đã không thiết lập biến SHELL. Trong trường hợp này, hành vi mặc định khác với ksh (và bash) ở chỗ là có thông báo một lỗi khi chúng ta cố gắng sử dụng một biến không tồn tại.

Bạn có thể sử dụng lệnh unset để bỏ thiết lập một biến và loại nó khỏi danh sách biến shell. Nếu biến đó đã được xuất khẩu đến môi trường, lệnh này cũng sẽ loại bỏ biến đó khỏi môi trường. Bạn có thể sử dụng lệnh set để kiểm soát nhiều khía cạnh về cách làm việc của bash (hoặc các shell khác). Lệnh set là một lệnh shell dựng sẵn, do đó các tùy chọn khác nhau là đặc thù riêng của shell. Trong bash, tùy chọn -u làm cho bash thông báo một lỗi với các biến chưa được định nghĩa chứ không xử lý chúng như là các biến đã định nghĩa nhưng rỗng. Bạn có thể bật các tùy chọn khác nhau của lệnh set bằng một dấu - và tắt chúng bằng một dấu +. Bạn có thể hiển thị tùy chọn set hiện tại bằng cách sử dụng lệnh echo $-.

Liệt kê 12. Bỏ thiết lập và thiết lập
[ian@echidna ~]$ echo $- 
himBH 
[ian@echidna ~]$ echo $VAR1

[ian@echidna ~]$ set -u;echo $- 
himuBH 
[ian@echidna ~]$ echo $VAR1
-bash: VAR1: unbound variable 
[ian@echidna ~]$ VAR1=v1 
[ian@echidna ~]$ VAR1=v1;echo $VAR1 
v1 
[ian@echidna ~]$ unset VAR1;echo $VAR1
-bash: VAR1: unbound variable 
[ian@echidna ~]$ set +u;echo $VAR1;echo $-
himBH

Nếu bạn sử dụng lệnh set không có bất cứ tùy chọn nào, thì lệnh này sẽ hiển thị tất cả các biến shell của bạn và các giá trị của chúng (nếu có). Ngoài ra còn có lệnh khác, declare (khai báo) mà bạn có thể sử dụng lệnh đó để tạo, xuất khẩu và hiển thị các giá trị của các biến shell. Bạn có thể khảo sát tỉ mỉ nhiều tùy chọn set còn lại và lệnh declare bằng cách sử dụng các trang hướng dẫn sử dụng (man pages). Chúng ta sẽ thảo luận về các trang hướng dẫn sử dụng sau trong bài viết này.

Lệnh Exec

Một lệnh cuối cùng cần trình bày là exec. Bạn có thể sử dụng lệnh exec để chạy một chương trình khác thay thế shell hiện hành. Liệt kê 13 bắt đầu một bash shell con và sau đó sử dụng exec để thay thế nó bằng một Korn shell. Khi thoát khỏi Korn shell, bạn quay trở lại tại bash shell ban đầu (trong ví dụ này là PID 2852).

Liệt kê 13. Sử dụng lệnh exec
[ian@echidna ~]$ echo $$ 
2852 
[ian@echidna ~]$ bash 
[ian@echidna ~]$ echo $$
5114 
[ian@echidna ~]$ exec ksh $ echo $$ 
5114 $ exit 
[ian@echidna ~]$ echo $$ 
2852

Thông tin hệ thống với lệnh uname

Lệnh uname in thông tin về hệ thống của bạn và nhân (kernel) của nó. Liệt kê 14 hiển thị các tùy chọn khác nhau cho lệnh uname và thông tin kết quả; mỗi tùy chọn từng được định nghĩa trong Bảng 3.

Liệt kê 14. Lệnh uname
[ian@echidna ~]$ uname 
Linux 
[ian@echidna ~]$ uname -s 
Linux 
[ian@echidna ~]$ uname -n 
echidna.raleigh.ibm.com 
[ian@echidna ~]$ uname -r
2.6.29.6-217.2.3.fc11.i686.PAE 
[ian@echidna ~]$ uname -v 
#1 SMP Wed Jul 29 16:05:22 EDT 2009 
[ian@echidna ~]$ uname -m 
i686 
[ian@echidna ~]$ uname -o 
GNU/Linux 
[ian@echidna ~]$ uname -a 
Linux echidna.raleigh.ibm.com 2.6.29.6-217.2.3.fc11.i686.PAE 
#1 SMP Wed Jul 29 16:05:22 EDT 2009 i686 i686 i386 GNU/Linux
Bảng 3. Các tùy chọn cho lệnh uname
Tùy chọnMô tả
-sIn tên của nhân. Đây là tùy chọn mặc định nếu không có tùy chọn nào khác được chỉ rõ.
-nIn tên nút (nodename) hoặc tên máy.
-rIn bản phát hành của nhân. Tùy chọn này thường được sử dụng với các lệnh xử lý mô đun.
-vIn phiên bản của nhân.
-mIn tên phần cứng (CPU) của máy tính.
-oIn tên hệ điều hành.
-aIn tất cả các thông tin trên.

Liệt kê 14 là từ một hệ thống Fedora 11 đang chạy trên một CPU Intel®. Lệnh uname có sẵn trên hầu hết các hệ thống UNIX® và hệ thống giống như UNIX cũng như Linux. Thông tin được in ra sẽ khác nhau tùy theo phiên bản và bản phân phối Linux cũng như theo loại máy tính bạn đang chạy. Liệt kê 15 cho thấy kết quả đầu ra của một hệ thống AMD Athlon 64 đang chạy trên Ubuntu 9.04.

Liệt kê 15. Sử dụng lệnh uname với một hệ thống khác
ian@attic4:~$ uname -a 
Linux attic4 2.6.28-14-generic #47-Ubuntu SMP Sat Jul 25 01:19:55 UTC 2009 x86_64 
GNU/Linux

Lược sử lệnh

Nếu bạn đang gõ vào các lệnh như bạn đọc, bạn có thể nhận thấy rằng bạn thường sử dụng một lệnh nhiều lần hoặc giống hệt nhau hoặc chỉ thay đổi nhỏ. Một tin tốt là bash shell có thể duy trì một lược sử của các lệnh của bạn. Theo mặc định, lược sử luôn bật lên. Bạn có thể tắt nó đi bằng cách sử dụng lệnh set +o history và bật lên lại bằng cách sử dụng lệnh set -o history. Một biến môi trường được gọi là HISTSIZE nói cho bash biết có thể lưu giữ bao nhiêu dòng lược sử. Một số các giá trị cài đặt khác điều khiển cách lược sử hoạt động và được quản lý như thế nào. Xem các trang hướng dẫn sử dụng bash để biết các chi tiết đầy đủ.

Một số các lệnh giúp bạn có thể sử dụng chức năng lược sử là:

history
Hiển thị toàn bộ lược sử.
history N
Hiển thị N dòng cuối cùng của lược sử của bạn.
history -d N
Xóa dòng N từ lược sử của bạn; bạn có thể làm điều này nếu dòng đó có chứa một mật khẩu chẳng hạn
!!
Lệnh gần đây nhất của bạn.
!N
Lệnh lược sử thứ N.
!-N
Lùi lại N lệnh trong lược sử (!-1 tương đương với !!)
!#
Lệnh hiện tại bạn đang gõ.
!string
Lệnh gần đây nhất bắt đầu với chuỗi ký tự (string).
!?string?
Lệnh gần đây nhất có chứa chuỗi ký tự (string).

Bạn cũng có thể sử dụng một dấu hai chấm (:) tiếp theo là một giá trị nhất định để truy cập hoặc sửa đổi một phần hoặc một lệnh từ lược sử của bạn. Liệt kê 16 minh họa một số tính năng lược sử.

Liệt kê 16. Thao tác lược sử lệnh
[ian@echidna ~]$ echo $$ 
2852 
[ian@echidna ~]$ env -i bash -c 'echo $$' 
9649 
[ian@echidna ~]$ !! 
env -i bash -c 'echo $$' 
10073
[ian@echidna ~]$ !ec 
echo $$ 2852 
[ian@echidna ~]$ !en:s/$$/$PPID/ 
env -i bash -c 'echo $PPID' 
2852 
[ian@echidna ~]$ history 6 
595 echo $$ 
596 env -i bash -c 'echo $$' 
597 env -i bash -c 'echo $$' 
598 echo $$ 
599 env -i bash -c 'echo $PPID' 
600 history 6 
[ian@echidna ~]$ history -d598

Các lệnh trong Liệt kê 16 làm những việc sau:

  1. Dội trả lại mã nhận dạng tiến trình PID của shell hiện tại.
  2. Chạy một lệnh echo trong shell mới và dội trả lại PID của shell đó.
  3. Chạy lại lệnh gần nhất vừa qua.
  4. Chạy lại lệnh gần nhất bắt đầu bằng 'ec'; ở đây sẽ chạy lại lệnh đầu tiên trong ví dụ này.
  5. Chạy lại lệnh gần nhất bắt đầu bằng 'en', nhưng thay thế '$PPID' vào chỗ '$$', sao cho PID cha mẹ được hiển thị thay thế.
  6. Hiển thị 6 lệnh gần nhất vừa qua của lược sử.
  7. Xoá mục 598 của lược sử, đó là lệnh echo gần nhất.

Bạn cũng có thể chỉnh sửa lược sử một cách tương tác. Bash shell sử dụng thư viện readline để quản lý việc chỉnh sửa lệnh và lược sử. Theo mặc định, các phím và tổ hợp phím được sử dụng để di chuyển đi qua lược sử hoặc chỉnh sửa các dòng tương tự như những phím và tổ hợp phím được sử dụng trong trình soạn thảo GNU Emacs. Các tổ hợp gõ phím Emacs thường được thể hiện như là C-x hoặc M-x, trong đó x là một phím thông thường, còn CM là các phím ControlMeta, tương ứng. Trên hệ thống máy tính cá nhân (PC) điển hình, phím Ctrl dùng như phím Control cho Emacs và phím Alt dùng như phím Meta. Bảng 3 tóm tắt một số chức năng chỉnh sửa lược sử sẵn có. Ngoài các tổ hợp phím được hiển thị trong Bảng 3, các phím dịch chuyển con trỏ như các phím mũi tên phải, trái, lên, xuống và phím Home và End thường được thiết lập để hoạt động một cách hợp lý. Các chức năng bổ sung cũng như cách làm thế nào để tùy chỉnh các tùy chọn này bằng cách sử dụng một tập tin khởi tạo readline (thường là inputrc trong thư mục nhà của bạn) có thể được tìm thấy trong các trang hướng dẫn sử dụng.

Bảng 3. Chỉnh sửa lược sử bằng các lệnh emacs
LệnhPhím PC thường dùngMô tả
C-fRight arrowDi chuyển sang phải một khoảng trống.
C-bLeft arrowDi chuyển sang trái một khoảng trống.
C-pUp arrowDi chuyển lên lệnh trước đó trong lược sử.
C-nDown arrowDi chuyển xuống một lệnh sau đó trong lược sử.
C-rTìm kiếm ngược tăng dần. Gõ một chữ cái hoặc các chữ cái để tìm kiếm ngược về trước một chuỗi ký tự. Ấn C-r một lần nữa để tìm kiếm sự xuất hiện trước nữa của cùng chuỗi ký tự ấy.
M-fAlt-fDi chuyển đến đầu từ tiếp theo; các môi trường GUI thường nhận tổ hợp phím này để mở trình đơn File của cửa sổ đó.
M-bAlt-bDi chuyển đến đầu của từ trước đó.
C-aHomeDi chuyển tới đầu dòng.
C-eEndDi chuyển tới cuối dòng.
BackspaceBackspaceXóa ký tự trước con trỏ.
C-dDelXóa ký tự trong con trỏ (các chức năng Del và Backspace có thể được đặt cấu hình theo nghĩa ngược lại).
C-kCtrl-kXóa (loại bỏ) tới cuối dòng và lưu lại văn bản đã bị xóa để sử dụng sau này.
M-dAlt-dXóa (loại bỏ) tới cuối từ và lưu lại văn bản đã bị xóa để sử dụng sau này.
C-yCtrl-yLấy lại văn bản đã loại bỏ bằng một lệnh loại bỏ nói trên.

Nếu bạn muốn thao tác lịch sử bằng cách sử dụng một chế độ chỉnh sửa giống như vi, thì bạn sử dụng lệnh set -o vi để chuyển sang chế độ vi. Sử dụng lệnh set -o emacs để chuyển về chế độ emacs. Khi bạn gọi một lệnh trong chế độ vi, ban đầu bạn đang ở chế độ chèn của vi. Trình soạn thảo vi được đề cập trong một bài viết khác trong loạt bài này. (Xem Tài nguyên về lộ trình của loạt bài này).


Các đường dẫn - lệnh của tôi ở đâu?

Một số lệnh bash được dựng sẵn, trong khi các lệnh khác ở bên ngoài. Bây giờ chúng ta hãy xem các lệnh bên ngoài và cách để chạy chúng và cách làm thế nào để biết một lệnh là lệnh bên trong.

Shell tìm thấy lệnh ở đâu?

Các lệnh bên ngoài chỉ là các tập tin trong hệ thống tập tin của bạn. Việc quản lý tập tin cơ bản sẽ được trình bày trong bài viết khác của loạt bài này. (Xem Tài nguyên về lộ trình của loạt bài). Trên các hệ thống Linux và UNIX, tất cả các tập tin được truy cập như một phần của một cây lớn duy nhất có gốc ở /. Trong ví dụ của chúng ta, cho đến nay, thư mục hiện tại của chúng ta là thư mục nhà của người dùng. Những người dùng không là root thường có một thư mục nhà ở trong thư mục /home, ví dụ như là /home/ian, trong trường hợp của tôi. Thư mục nhà của root luôn là /root. Nếu bạn gõ một tên lệnh, thì bash sẽ tìm lệnh này trên đường dẫn của bạn, đó là một danh sách các thư mục được phân tách bằng dấu hai chấm trong biến môi trường PATH.

Nếu bạn muốn biết lệnh nào sẽ được thực hiện khi bạn gõ một chuỗi ký tự cụ thể, hãy sử dụng lệnh which hay type. Liệt kê 17 cho thấy đường dẫn mặc định của tôi cùng với các vị trí của một số lệnh.

Liệt kê 17. Tìm các vị trí lệnh
[ian@echidna ~]$ echo $PATH
/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/lib/ccache:/usr/local/bin:/bin:/usr/b
in:/home/ian/bin 
[ian@echidna ~]$ which bash env zip xclock echo set ls 
alias ls='ls --color=auto' 
        /bin/ls 
/bin/bash 
/bin/env 
/usr/bin/zip 
/usr/bin/xclock          
/bin/echo 
/usr/bin/which: no set in (/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/lib/ccache
:/usr/local/bin:/bin:/usr/bin:/home/ian/bin) 
[ian@echidna ~]$ type bash env zip xclock echo set ls 
bash is hashed (/bin/bash) 
env is hashed (/bin/env) 
zip is /usr/bin/zip 
xclock is /usr/bin/xclock 
echo is a shell builtin 
set is a shell builtin 
ls is aliased to `ls --color=auto'

Lưu ý rằng các thư mục trong đường dẫn chủ yếu là kết thúc ở /bin. Đây là một quy ước chung, nhưng không phải là một yêu cầu bắt buộc, như bạn có thể thấy từ /usr/lib/ccache. Lệnh which đã thông báo rằng lệnh ls là một alias (bí danh) và không thể tìm thấy lệnh set. Trong trường hợp này, chúng ta diễn giải điều đó có nghĩa là lệnh không tồn tại hay đó là một lệnh dựng sẵn. Lệnh type thông báo rằng lệnh ls là một alias, nhưng nó nhận biết lệnh set như là một lệnh shell đã dựng sẵn. Nó cũng thông báo rằng có một lệnh echo dựng sẵn cũng như có một lệnh trong /bin mà which đã tìm thấy. Các lệnh cũng tạo ra kết quả đầu ra theo các thứ tự khác nhau.

Chúng ta thấy rằng lệnh ls được sử dụng để liệt kê các nội dung thư mục, là một alias. Các bí danh là một cách tiện dụng để cấu hình một số lệnh để sử dụng các tập hợp mặc định khác nhau hoặc để cung cấp một tên thay thế cho một lệnh. Trong ví dụ của chúng ta, tùy chọn --color=tty làm cho các liệt kê thư mục sẽ phân biệt kiểu tập tin hoặc thư mục bằng màu sắc khác nhau. Hãy thử chạy dircolors --print-database để xem các mã màu sắc được kiểm soát như thế nào và loại màu nào được dùng cho loại tập tin nào.

Mỗi một trong số các lệnh này có các tùy chọn bổ sung. Tùy thuộc vào nhu cầu của bạn, bạn có thể sử dụng lệnh này hay lệnh kia. Tôi có xu hướng sử dụng lệnh which khi tôi khá chắc chắn là sẽ tìm thấy một tập tin thi hành được và tôi chỉ cần đặc tả đường dẫn đầy đủ của nó. Tôi thấy rằng lệnh type cho tôi biết thêm nhiều thông tin chính xác hơn, mà đôi khi tôi cần trong một kịch bản lệnh shell.

Chạy các lệnh khác

Chúng ta đã thấy trong Liệt kê 17 rằng các tập tin có thể thi hành được có một đường dẫn đầy đủ bắt đầu bằng /, tức là thư mục gốc. Ví dụ, chương trình xclock thực sự là /usr/bin/xclock, một tập tin nằm trong thư mục /usr/bin. Trên các hệ thống cũ hơn, thay vào đó, bạn có thể tìm thấy tập tin này trong thư mục /usr/X11R6/bin. Nếu một lệnh không có trong đặc tả PATH (đường dẫn) của bạn, bạn vẫn có thể chạy nó bằng cách chỉ rõ đường dẫn cùng với tên lệnh. Bạn có thể sử dụng hai loại đường dẫn:

  • Các đường dẫn tuyệt đối (absolute) là những đường dẫn bắt đầu bằng /, như là những đường dẫn chúng ta đã thấy trong Liệt kê 17 (/bin/bash, /bin/env, v.v).
  • Các đường dẫn tương đối (relative) so với vị trí thư mục làm việc hiện tại của bạn, như lệnh pwd báo lại. Những lệnh này không bắt đầu bằng /, mà chứa ít nhất một /.

Bạn có thể sử dụng các đường dẫn tuyệt đối bất kể thư mục làm việc hiện tại của bạn ở đâu, nhưng nhiều khả năng bạn sẽ có thể sử dụng các đường dẫn tương đối chỉ khi một lệnh nằm ở rất gần với thư mục hiện tại của bạn. Giả sử bạn đang phát triển một phiên bản mới của chương trình "Hello World!" kinh điển trong một thư mục con của thư mục nhà của bạn tên là mytestbin. Bạn có thể sử dụng đường dẫn tương đối để chạy lệnh của bạn dưới dạng mytestbin/hello. Có hai tên đặc biệt bạn có thể sử dụng trong một đường dẫn; một dấu chấm duy nhất (.) dùng để chỉ thư mục hiện tại và một cặp dấu chấm (..) để chỉ thư mục cha mẹ của thư mục hiện hành. Vì thư mục nhà của bạn thường không có trên PATH của bạn (và nói chung không nên có), bạn sẽ cần phải cung cấp tường minh một đường dẫn cho bất kỳ tập tin thi hành được nào mà bạn muốn chạy từ thư mục nhà của bạn. Ví dụ, nếu bạn đã có một bản sao của chương trình hello của bạn trong thư mục nhà của bạn, bạn có thể chạy nó bằng lệnh ./hello. Bạn có thể sử dụng cả dấu . và dấu .. như một phần của một đường dẫn tuyệt đối, mặc dù một dấu chấm . đơn không có ích lợi gì trong trường hợp này. Bạn cũng có thể sử dụng một dấu ngã (~) có nghĩa là thư mục nhà của bạn và ~username có nghĩa là thư mục nhà của người dùng có tên username. Một số ví dụ được hiển thị trong Liệt kê 18.

Liệt kê 18. Các đường dẫn tuyệt đối và tương đối
[ian@echidna ~]$ /bin/echo Use echo command rather than builtin 
Use echo command rather than builtin 
[ian@echidna ~]$ /usr/../bin/echo Include parent dir in path 
Include parent dir in path
[ian@echidna ~]$ /bin/././echo Add a couple of useless path components 
Add a couple of useless path components 
[ian@echidna ~]$ pwd # See where we are
/home/ian 
[ian@echidna ~]$ ../../bin/echo Use a relative path to echo 
Use a relative path to echo 
[ian@echidna ~]$ myprogs/hello # Use a relative path with no dots 
-bash: myprogs/hello: No such file or directory 
[ian@echidna ~]$ mytestbin/hello # Use a relative path with no dots 
Hello world!
[ian@echidna ~]$ ./hello 
Hello world! 
[ian@echidna ~]$ ~/mytestbin/hello # run hello using ~ 
Hello world! 
[ian@echidna ~]$ ../hello # Try running  hello from parent 
-bash: ../hello: No such file or directory

Thay đổi thư mục làm việc của bạn

Cũng giống như bạn có thể thi hành các chương trình từ các thư mục khác nhau trong hệ thống, bạn có thể thay đổi thư mục làm việc hiện tại của bạn bằng cách sử dụng lệnh cd. Đối số của cd phải là đường dẫn tuyệt đối hay tương đối tới một thư mục. Cũng giống như với các lệnh, bạn có thể sử dụng dấu ., dấu .., dấu ~, và ~username trong đường dẫn. Nếu bạn sử dụng cd mà không có tham số nào, đó sẽ là chuyển tới thư mục nhà của bạn. Một gạch nối duy nhất (-) là tham số dùng để chuyển đến thư mục làm việc trước đó. Thư mục nhà của bạn được lưu trữ trong biến môi trường HOME và thư mục trước đó được lưu trữ trong biến OLDPWD, do đó một mình cd tương đương với cd $HOMEcd - tương đương với cd $OLDPWD. Thông thường chúng ta nói thay đổi thư mục thay cho toàn văn thay đổi thư mục làm việc hiện tại.

Cũng giống như đối với các lệnh, cũng có một biến môi trường, CDPATH, chứa một tập hợp các thư mục được phân tách bằng dấu hai chấm cần được tìm kiếm (ngoài thư mục làm việc hiện tại) khi phân giải các đường dẫn tương đối. Nếu việc phân giải đã sử dụng một đường dẫn từ CDPATH, thì cd sẽ in đường dẫn đầy đủ của thư mục kết quả làm đầu ra. Thông thường, nếu chuyển đổi thư mục thành công, không dẫn đến kết quả đầu ra nào khác hơn là một dấu nhắc mới, có thể đổi khác. Một số ví dụ được hiển thị trong Liệt kê 19.

Liệt kê 19. Thay đổi các thư mục
[ian@echidna ~]$ cd /;pwd 
/ 
[ian@echidna /]$ cd /usr/local;pwd
/usr/local 
[ian@echidna local]$ cd ;pwd 
/home/ian 
[ian@echidna ~]$ cd -;pwd 
/usr/local /usr/local 
[ian@echidna local]$ cd ~ian/..;pwd 
/home
[ian@echidna home]$ cd ~;pwd 
/home/ian 
[ian@echidna ~]$ export CDPATH=~ 
[ian@echidna ~]$ cd /;pwd 
/ 
[ian@echidna /]$ cd mytestbin 
/home/ian/mytestbin

Các trang hướng dẫn sử dụng

Chủ đề cuối cùng của chúng ta trong bài viết này sẽ cho bạn biết cách làm thế nào để có được tài liệu hướng dẫn về các lệnh Linux thông qua các trang hướng dẫn sử dụng và các nguồn tài liệu khác.

Các trang và các phần hướng dẫn sử dụng

Nguồn tài liệu chính (và truyền thống) là các trang hướng dẫn sử dụng, mà bạn có thể truy cập bằng cách sử dụng lệnh man. Hình 1 minh họa trang hướng dẫn sử dụng của chính lệnh man. Sử dụng lệnh man man để hiển thị thông tin này.

Hình 1. Trang hướng dẫn sử dụng cho lệnh man
Trang hướng dẫn sử dụng cho lệnh man với các số cho thấy các mục được lập danh sách các ảnh dưới đây

Hình 1 cho thấy một số mục tiêu biểu trong các trang hướng dẫn sử dụng:

  • Một tiêu đề có tên của các lệnh tiếp theo là số phần của nó trong dấu ngoặc đơn.
  • Tên của lệnh và các lệnh có liên quan bất kỳ được mô tả trong cùng một trang hướng dẫn sử dụng.
  • Một bản tóm tắt các tùy chọn và các tham số áp dụng cho lệnh này.
  • Một mô tả ngắn gọn về lệnh.
  • Thông tin chi tiết về mỗi tùy chọn.

Bạn có thể tìm thấy những phần khác về cách sử dụng, làm thế nào để thông báo các lỗi, thông tin tác giả và một danh sách các lệnh có liên quan. Ví dụ, trang hướng dẫn sử dụng cho lệnh man cho chúng ta biết rằng các lệnh liên quan (và các phần hướng dẫn sử dụng của chúng) là:

apropos(1), whatis(1), less(1), groff(1), and man.conf(5).

Có tám nhóm trang hướng dẫn sử dụng thường gặp. Các trang hướng dẫn sử dụng thường được cài đặt khi bạn cài đặt một gói, vì vậy nếu bạn chưa cài đặt một gói phần mềm, nhiều khả năng bạn sẽ không có trang hướng dẫn sử dụng cho nó. Tương tự, một số phần hướng dẫn sử dụng của bạn có thể rỗng hoặc gần như rỗng. Dưới đây là những nhóm trang hướng dẫn sử dụng thường gặp và một số nội dung ví dụ:

  1. Các lệnh của người dùng (env, ls, echo, mkdir, tty).
  2. Các cuộc gọi hệ thống hoặc các chức năng nhân (link, sethostname, mkdir.
  3. Các thường trình thư viện (acosh, asctime, btree, locale, XML::Parser).
  4. Thông tin liên quan đến thiết bị (isdn_audio, mouse, tty, zero).
  5. Mô tả định dạng tập tin (keymaps, motd, wvdial.conf).
  6. Các trò chơi (lưu ý rằng nhiều trò chơi hiện nay có đồ họa và có trợ giúp đồ họa ngoài hệ thống trang hướng dẫn sử dụng).
  7. Các nhóm linh tinh khác (arp, boot, regex, unix utf8).
  8. Quản trị hệ thống (debugfs, fdisk, fsck, mount, renice, rpm).

Các nhóm khác mà bạn có thể tìm thấy bao gồm 9 cho tài liệu của nhân Linux, n cho tài liệu mới, o cho tài liệu cũ và l cho tài liệu hướng dẫn cục bộ.

Một số mục xuất hiện trong nhiều nhóm. Ví dụ chúng ta cho thấy mkdir có trong nhóm 1 và 2 và tty trong nhóm 1 và 4. Bạn có thể chỉ rõ một nhóm cụ thể, ví dụ, man 4 tty hoặc man 2 mkdir, hoặc bạn có thể chỉ rõ tùy chọn -a để liệt kê tất cả các nhóm hướng dẫn sử dụng có thể có.

Bạn có thể nhận thấy trong hình minh họa là lệnh man có nhiều tùy chọn cho bạn tự khám phá. Bây giờ, chúng ta hãy xem nhanh một số các lệnh "Xem thêm" (See also) có liên quan đến man.

Xem thêm

Hai lệnh quan trọng liên quan đến manwhatisapropos. Lệnh whatis tìm kiếm các trang hướng dẫn sử dụng theo tên mà bạn đưa ra và hiển thị các thông tin tên từ các trang hướng dẫn sử dụng thích hợp. Lệnh apropos thực hiện tìm kiếm từ khoá của các trang hướng dẫn sử dụng và liệt kê các trang có chứa từ khóa của bạn. Liệt kê 20 minh hoạ các lệnh này.

Liệt kê 20. Ví dụ về lệnh whatis và apropos
[ian@echidna ~]$ whatis man 
man [] (1) - format and display the on-line manual pages 
man [] (1p) - display system documentation 
man [] (7) - macros to format man pages 
man [] (7) - pages - conventions for writing Linux man pages
man.config [] (5) - configuration data for man 
man-pages (rpm) - Man (manual) pages from the Linux Documentation Project 
man (rpm) - A set of documentation tools: man, apropos and whatis 
[ian@echidna ~]$ whatis mkdir 
mkdir [] (1) - make directories
mkdir [] (1p) - make directories 
mkdir [] (2) - create a directory 
mkdir [] (3p) - make a directory 
[ian@echidna ~]$ apropos mkdir 
mkdir [] (1) - make directories
mkdir [] (1p) - make directories 
mkdir [] (2) - create a directory 
mkdir [] (3p) - make a directory 
mkdirat [] (2) - create a directory relative to a directory file descriptor 
mkdirhier [] (1) - makes a directory hierarchy

Nhân đây, nếu bạn không thể tìm thấy trang hướng dẫn sử dụng cho man.conf, hãy thử chạy lệnh thay thế man man.config.

Các trang lệnh man xuất kết quả trên màn hiển thị của bạn bằng cách sử dụng một chương trình phân trang. Trên phần lớn các hệ thống Linux, đây nhiều khả năng sẽ là chương trình less. Một sự lựa chọn khác có thể là chương trình more cũ hơn. Nếu bạn muốn in trang, hãy chỉ rõ tùy chọn -t để định dạng trang in bằng cách sử dụng chương trình groff hoặc troff.

Trình phân trang less có một số lệnh giúp bạn tìm kiếm các chuỗi ký tự trong kết quả đầu ra đã hiển thị. Sử dụng lệnh man less để tìm hiểu thêm về / (tìm kiếm xuôi), ? (tìm kiếm ngược về trước) và n (lặp lại tìm kiếm cuối cùng), trong số rất nhiều các lệnh khác.

Các nguồn tài liệu khác

Ngoài các trang hướng dẫn sử dụng có thể truy cập từ một dòng lệnh, Quỹ phần mềm miễn phí (Free Software Foundation) đã tạo ra một số các tập tin info (thông tin) được xử lý bằng chương trình info. Các tập tin này cung cấp các phương tiện chuyển hướng rộng rãi bao gồm khả năng để chuyển đến các nhóm khác. Hãy thử lệnh man info hay info info để biết thêm thông tin. Không phải tất cả các lệnh đều có tài liệu hướng dẫn bằng info, do đó, bạn sẽ nhận thấy mình sử dụng cả hai lệnh man và info nếu bạn trở thành một người sử dụng info.

Cũng có một số giao diện đồ họa cho các trang hướng dẫn sử dụng, chẳng hạn như xman (từ Dự án XFree86) và yelp (trình duyệt trợ giúp Gnome 2.0).

Nếu bạn không thể tìm thấy sự trợ giúp cho một lệnh, hãy thử chạy lệnh với tùy chọn --help. Việc này có thể cung cấp sự trợ giúp của lệnh hoặc nó có thể cho bạn biết làm thế nào để nhận được sự trợ giúp mà bạn cần.

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

  • Với phần mềm dùng thử của IBM, có sẵn để tải trực tiếp từ developerWorks, hãy xây dựng dự án phát triển tiếp theo của bạn trên Linux.

Thảo luận

  • Hãy dành tâm trí cho cộng đồng My developerWorks; với khái lược cá nhân và trang chủ tùy chỉnh của bạn, bạn có thể làm cho developerWorks phù hợp với sự quan tâm của bạn và tương tác với người sử dụng developerWorks khác.

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở
ArticleID=517887
ArticleTitle=Tìm hiểu Linux, 101: Dòng lệnh Linux
publish-date=08312009