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 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ự là 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:
- stdin là luồng đầu vào tiêu chuẩn, cung cấp đầu vào cho các lệnh.
- stdout là luồng đầu ra tiêu chuẩn, hiển thị đầu ra từ các lệnh.
- stderr là luồ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.
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ọn và cá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 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át | Chức năng |
|---|---|
| \a | Cảnh báo (chuông) |
| \b | Lùi một vị trí |
| \c | Loại bỏ ký tự xuống dòng mới ở đuôi (cùng chức năng như tùy chọn -n) |
| \f | In ra và bắt đầu một trang mới (xóa màn hình trên màn hiển thị video) |
| \n | Dòng mới |
| \r | Xuống dòng |
| \t | Dấu tab ngang |
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 |
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.
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ên | Chức năng |
|---|---|
| USER | Tên của người dùng đã đăng nhập. |
| UID | Số nhận dạng người dùng của người dùng đã đăng nhập. |
| HOME | Thư mục nhà của người dùng. |
| PWD | Thư mục làm việc hiện tại. |
| SHELL | Tê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. |
| PPID | Số 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 |
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 ý:
- Lúc bắt đầu dãy lệnh này, bash shell có PID 2559.
- Bash shell thứ hai có PID 2811 và shell cha mẹ của nó là PID 2559, đó là bash shell ban đầu.
- 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.
- Trong Korn shell, chúng ta tạo ra biến VAR4. Lệnh
echochỉ 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ệnhpssẽ nói cho bạn biết lệnh hiện tại. Lưu ý rằngpsđặ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. - Quay lại bash shell thứ hai, chúng ta có thể nhìn thấy các biến VAR1, VAR2 và VAR3.
- 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 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.
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:
- 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.
- 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.
- 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.
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 |
| Tùy chọn | Mô tả |
|---|---|
| -s | In 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õ. |
| -n | In tên nút (nodename) hoặc tên máy. |
| -r | In 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. |
| -v | In phiên bản của nhân. |
| -m | In tên phần cứng (CPU) của máy tính. |
| -o | In tên hệ điều hành. |
| -a | In 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 |
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:
- Dội trả lại mã nhận dạng tiến trình PID của shell hiện tại.
- Chạy một lệnh echo trong shell mới và dội trả lại PID của shell đó.
- Chạy lại lệnh gần nhất vừa qua.
- 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.
- 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ế.
- Hiển thị 6 lệnh gần nhất vừa qua của lược sử.
- 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 C và M là các phím Control và Meta, 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ệnh | Phím PC thường dùng | Mô tả |
|---|---|---|
| C-f | Right arrow | Di chuyển sang phải một khoảng trống. |
| C-b | Left arrow | Di chuyển sang trái một khoảng trống. |
| C-p | Up arrow | Di chuyển lên lệnh trước đó trong lược sử. |
| C-n | Down arrow | Di chuyển xuống một lệnh sau đó trong lược sử. |
| C-r | Tì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-f | Alt-f | Di 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-b | Alt-b | Di chuyển đến đầu của từ trước đó. |
| C-a | Home | Di chuyển tới đầu dòng. |
| C-e | End | Di chuyển tới cuối dòng. |
| Backspace | Backspace | Xóa ký tự trước con trỏ. |
| C-d | Del | Xó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-k | Ctrl-k | Xó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-d | Alt-d | Xó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-y | Ctrl-y | Lấ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.
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ú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
pwdbá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 $HOME và cd - 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 |
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
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ụ:
- Các lệnh của người dùng (env, ls, echo, mkdir, tty).
- Các cuộc gọi hệ thống hoặc các chức năng nhân (link, sethostname, mkdir.
- Các thường trình thư viện (acosh, asctime, btree, locale, XML::Parser).
- Thông tin liên quan đến thiết bị (isdn_audio, mouse, tty, zero).
- Mô tả định dạng tập tin (keymaps, motd, wvdial.conf).
- 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).
- Các nhóm linh tinh khác (arp, boot, regex, unix utf8).
- 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.
Hai lệnh quan trọng liên quan đến man là whatis và apropos. 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.
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.
Học tập
- Sử dụng lộ trình cho LPIC-1 để tìm các bài viết
của developerWorks mà bạn cần để giúp bạn chuẩn bị cho chứng chỉ LPIC-1 dựa vào các
mục tiêu tháng 4 năm 2009.
- Xem các mục tiêu tháng 4 năm 2009 cho kỳ thi LPI 101 và kỳ thi 102. Bạn nên thường xuyên tham khảo các mục tiêu cho các yêu cầu
cuối cùng.
- Xem lại toàn bộ loạt bài chuẩn bị cho kỳ thi LPI trên
developerWorks để tìm hiểu cơ bản về Linux và chuẩn bị cho chứng chỉ quản trị hệ
thống dựa trên mục tiêu có trước tháng 4 năm 2009.
- Tại Chương trình
LPIC, tìm các danh sách công việc, các câu hỏi mẫu và các mục tiêu chi tiết
cho ba trình độ của chứng chỉ quản trị hệ thống Linux của Viện Linux chuyên
nghiệp.
- Trong "Các nhiệm vụ cơ bản cho các nhà phát triển
Linux mới" (developerWorks, 03.2005), tìm hiểu cách mở một cửa sổ đầu cuối
hoặc dấu nhắc shell và nhiều hơn nữa.
-
Các Dự án tài liệu Linux có nhiều tài liệu có
ích, đặc biệt là các sách hướng dẫn (HOWTO) của nó.
- Trong vùng Linux của developerWorks, tìm thêm
nhiều tài nguyên cho các nhà phát triển Linux và xem qua các bài viết và các hướng dẫn phổ biến
nhất của chúng tôi.
- Xem tất cả các lời khuyên Linux và các hướng dẫn Linux trên developerWorks.
- Theo sát với các sự kiện kỹ thuật và webcast của
developerWorks.
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.
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.