2.1 Bài 1
Chứng chỉ: |
Linux Essentials |
---|---|
Phiên bản: |
1.6 |
Chủ đề: |
2 Tìm đường trong Hệ thống Linux |
Mục tiêu: |
2.1 Những Khái niệm cơ bản về Dòng Lệnh |
Bài: |
1 trên 2 |
Giới thiệu
Các bản phân phối Linux hiện đại có rất nhiều loại giao diện đồ hoạ người dùng, nhưng quản trị viên luôn phải biết cách làm việc với dòng lệnh hay còn gọi là vỏ (shell). Vỏ là một chương trình cho phép giao tiếp dựa trên văn bản giữa hệ điều hành và người dùng. Nó thường là một chương trình ở chế độ văn bản và có thể đọc đầu vào của người dùng rồi diễn giải nó dưới dạng các lệnh cho hệ thống.
Có một số trình vỏ khác nhau trên Linux, dưới đây là một số ví dụ:
-
Vỏ Bourne-again (Bash)
-
Vỏ C (csh hoặc tcsh, csh nâng cao)
-
Vỏ Korn (ksh)
-
Vỏ Z (zsh)
Trên Linux, vỏ phổ biến nhất là Vỏ Bash. Đây cũng là vỏ sẽ được sử dụng trong các ví dụ hoặc bài tập trong bài học này.
Khi sử dụng một vỏ tương tác, người dùng sẽ nhập lệnh tại dấu nhắc lệnh. Dấu nhắc lệnh mặc định có thể sẽ hơi khác nhau một chút tuỳ theo từng bản phân phối của Linux, nhưng chúng thường đều tuân theo cấu trúc sau:
username@hostname current_directory shell_type
Trên Ubuntu hoặc Debian GNU/Linux, dấu nhắc lệnh dành cho người dùng thông thường sẽ có dạng như sau:
carol@mycomputer:~$
Dấu nhắc lệnh của siêu người dùng sẽ giống như sau:
root@mycomputer:~#
Trên CentOS hoặc Red Hat Linux, dấu nhắc lệnh cho người dùng thông thường sẽ giống như sau:
[dave@mycomputer ~]$
Dấu nhắc lệnh của siêu người dùng sẽ giống như sau:
[root@mycomputer ~]#
Hãy cùng giải thích từng thành phần của cấu trúc này:
username
-
Tên của người dùng chạy vỏ
hostname
-
Tên của máy chủ mà vỏ chạy trên đó. Ngoài ra còn có một lệnh
hostname
mà bạn có thể dùng để hiển thị hoặc đặt tên máy chủ của hệ thống. current_directory
-
Thư mục chứa vỏ hiện tại.
~
có nghĩa là vỏ đang nằm trong thư mục chính của người dùng hiện tại. shell_type
-
$
cho biết vỏ được điều hành bởi người dùng thông thường.#
cho biết vỏ được điều hành bởi siêu người dùngroot
.
Vì không cần bất kỳ đặc quyền đặc biệt nào nên chúng ta sẽ sử dụng một dấu nhắc lệnh không có đặc quyền trong các ví dụ tiếp theo. Để ngắn gọn hơn, ta sẽ chỉ sử dụng $
làm dấu nhắc lệnh.
Cấu trúc của Dòng lệnh
Hầu hết các lệnh tại dòng lệnh đều sẽ tuân theo một cấu trúc cơ bản giống nhau:
command [option(s)/parameter(s)...] [argument(s)...]
Lấy lệnh sau làm ví dụ:
$ ls -l /home
Hãy cùng giải thích mục đích của từng thành phần:
- Command (Lệnh)
-
Chương trình mà người dùng sẽ chạy – trong ví dụ trên là
ls
. - Option(s)/Parameter(s) (Tuỳ chọn/ Tham số)
-
Một “khoá chuyển” dùng để sửa đổi hành vi của lệnh theo một cách nào đó, chẳng hạn như
-l
trong ví dụ trên. Các tùy chọn có thể được truy cập ở cả dạng ngắn và dài. Ví dụ:-l
sẽ giống với--format=long
.Có thể kết hợp nhiều tuỳ chọn với nhau; đối với dạng viết tắt, các chữ cái thường có thể được nhập cùng nhau. Ví dụ: tất cả các lệnh sau đều thực hiện cùng một việc:
$ ls -al $ ls -a -l $ ls --all --format=long
- Argument(s) (Đối số)
-
Dữ liệu bổ sung mà chương trình yêu cầu, ví dụ như tên tệp hoặc đường dẫn (như
/home
trong ví dụ trên).
Phần bắt buộc duy nhất của cấu trúc này là lệnh. Thông thường, tất cả các phần khác đều là tùy chọn, nhưng một chương trình có thể yêu cầu chỉ định một số tùy chọn, tham số hoặc đối số cụ thể.
Note
|
Hầu hết các lệnh đều sẽ hiển thị một tổng quan ngắn về các tùy chọn khả dụng khi chúng được thực thi với tham số |
Các loại Hành vi của Lệnh
Vỏ hỗ trợ hai loại lệnh:
- Internal (Lệnh nội bộ)
-
Những lệnh này là một phần của chính vỏ và không phải là các chương trình riêng biệt. Có khoảng 30 lệnh như vậy. Mục đích chính của chúng là thực thi các tác vụ bên trong vỏ (ví dụ:
cd
,set
,export
). - External (Lệnh bên ngoài)
-
Các lệnh này nằm trong các tệp riêng lẻ. Các tệp này thường là các chương trình nhị phân hoặc têp lệnh. Khi một lệnh không phải là lệnh tích hợp sẵn của vỏ được chạy, vỏ sẽ sử dụng biến
PATH
để tìm kiếm một tệp có thể thực thi có cùng tên với lệnh. Ngoài các chương trình được cài đặt cùng với trình quản lý gói của bản phân phối, người dùng cũng có thể tạo các lệnh bên ngoài của riêng họ.
Lệnh type
cho biết cụ thể đó là loại lệnh nào:
$ type echo echo is a shell builtin $ type man man is /usr/bin/man
Trích dẫn
Là người dùng Linux, bạn sẽ phải tạo hoặc thao tác với các tệp hoặc các biến theo nhiều cách khác nhau. Điều này khá là dễ dàng khi làm việc với các tên tệp ngắn hay các giá trị đơn lẻ, nhưng sẽ trở nên phức tạp hơn khi có liên quan đến chẳng hạn như khoảng trắng, ký tự đặc biệt và biến. Vỏ cung cấp một tính năng được gọi là trích dẫn để gói gọn các dữ liệu đó bằng nhiều loại trích dẫn khác nhau (" ", ' '). Có ba loại trích dẫn trong Bash:
-
Trích dẫn kép
-
Trích dẫn đơn
-
Ký tự Thoát
Ví dụ: các lệnh sau không hoạt động theo cùng một kiểu do các cách trích dẫn của chúng khác nhau:
$ TWOWORDS="two words" $ touch $TWOWORDS $ ls -l -rw-r--r-- 1 carol carol 0 Mar 10 14:56 two -rw-r--r-- 1 carol carol 0 Mar 10 14:56 words $ touch "$TWOWORDS" $ ls -l -rw-r--r-- 1 carol carol 0 Mar 10 14:56 two -rw-r--r-- 1 carol carol 0 Mar 10 14:58 'two words' -rw-r--r-- 1 carol carol 0 Mar 10 14:56 words $ touch '$TWOWORDS' $ ls -l -rw-r--r-- 1 carol carol 0 Mar 10 15:00 '$TWOWORDS' -rw-r--r-- 1 carol carol 0 Mar 10 14:56 two -rw-r--r-- 1 carol carol 0 Mar 10 14:58 'two words' -rw-r--r-- 1 carol carol 0 Mar 10 14:56 words
Note
|
Dòng có |
Trích dẫn Kép
Dấu trích dẫn kép ("...") cho phép vỏ xử lý văn bản ở giữa nó như những ký tự thông thường. Tất cả các ký tự đặc biệt đều sẽ mất ý nghĩa, ngoại trừ $
(ký hiệu đô la), \
(dấu gạch chéo ngược) và `
(trích dẫn ngược). Điều này có nghĩa là các biến, các trình thay thế lệnh và các hàm số học vẫn có thể được sử dụng.
Ví dụ: việc thay thế biến $USER
không bị ảnh hưởng bởi dấu trích dẫn kép:
$ echo I am $USER I am tom $ echo "I am $USER" I am tom
Mặt khác, một ký tự khoảng trắng sẽ không còn là một dấu phân tách đối số nữa:
$ touch new file $ ls -l -rw-rw-r-- 1 tom students 0 Oct 8 15:18 file -rw-rw-r-- 1 tom students 0 Oct 8 15:18 new $ touch "new file" $ ls -l -rw-rw-r-- 1 tom students 0 Oct 8 15:19 new file
Như bạn thấy, trong ví dụ đầu tiên, lệnh touch
đã tạo ra hai tệp riêng lẻ; lệnh này diễn giải hai chuỗi dưới dạng các đối số riêng lẻ. Trong ví dụ thứ hai, lệnh diễn giải cả hai chuỗi dưới dạng một đối số; do đó, nó chỉ tạo ra một tệp. Tuy nhiên, tốt nhất là nên tránh ký tự khoảng trắng trong tên tệp. Thay vào đó, ta có thể sử dụng dấu gạch dưới (_
) hoặc dấu chấm (.
).
Trích dẫn Đơn
Dấu trích dẫn đơn không có ngoại lệ của dấu trích dẫn kép. Chúng sẽ loại bỏ bất kỳ ý nghĩa đặc biệt nào của mỗi một ký tự. Hãy lấy một trong những ví dụ đầu tiên đã nêu ở trên:
$ echo I am $USER I am tom
Khi áp dụng các trích dẫn đơn, bạn sẽ thấy một kết quả khác:
$ echo 'I am $USER' I am $USER
Bây giờ lệnh lại hiện hiển thị chuỗi chính xác mà không cần thay thế biến.
Ký tự Thoát
Chúng ta có thể sử dụng ký tự thoát để xóa đi ý nghĩa đặc biệt của các ký tự khỏi Bash. Quay lại biến môi trường $USER
:
$ echo $USER carol
Ta có thể thấy rằng, theo mặc định, nội dung của biến sẽ được hiển thị trong cửa sổ dòng lệnh. Tuy nhiên, nếu chúng ta sử dụng ký tự gạch chéo (\) trước ký hiệu đô la ($) thì ý nghĩa đặc biệt của ký hiệu đô la sẽ bị bỏ qua. Điều này sẽ không cho phép Bash mở rộng giá trị của biến thành tên người dùng đang chạy lệnh, mà thay vào đó sẽ giải thích tên biến theo nghĩa đen:
$ echo \$USER $USER
Nếu bạn còn nhớ, ta có thể nhận được các kết quả tương tự như kết quả này bằng cách sử dụng trích dẫn đơn để cho ra nội dung nguyên bản của bất kỳ thứ gì nằm giữa các dấu nháy đơn. Tuy nhiên, ký tự thoát hoạt động bằng cách chỉ dẫn Bash bỏ qua bất kỳ ý nghĩa đặc biệt nào mà ký tự đứng trước nó có thể có.
Bài tập Hướng dẫn
-
Hãy chia các dòng bên dưới thành các thành phần của lệnh, tùy chọn/ tham số và đối số:
-
Ví du:
cat -n /etc/passwd
Lệnh:
cat
Tuỳ chọn:
-n
Đối số:
/etc/passwd
-
ls -l /etc
Lệnh:
Tuỳ chọn:
Đối số:
-
ls -l -a
Lệnh:
Tuỳ chọn:
Đối số:
-
cd /home/user
Lệnh:
Tuỳ chọn:
Đối số:
-
-
Hãy cho biết các lệnh sau thuộc loại lệnh nào:
Ví dụ:
pwd
Lệnh tích hợp sẵn của vỏ
mv
Lệnh bên ngoài
cd
cat
exit
-
Hãy giải quyết các lệnh sau sử dụng trích dẫn kép:
Ví dụ:
echo "$HOME is my home directory"
echo /home/user is my home directory
touch "$USER"
touch 'touch'
Bài tập Mở rộng
-
Hãy sử dụng một lệnh và phần mở rộng dấu ngoặc trong Bash (xem lại trang hướng dẫn về Bash), hãy tạo 5 tệp được đánh số từ 1 đến 5 với tiền tố
game
(game1
,game2
, …). -
Hãy xóa tất cả 5 tệp mà bạn vừa tạo chỉ với một lệnh và một ký tự đặc biệt khác (xem lại phần Mở rộng Tên đường dẫn trong trang hướng dẫn của Bash).
-
Có cách nào khác để làm cho hai lệnh tương tác với nhau không? Đó là những cách gì?
Tóm tắt
Trong bài học này, bạn đã học về:
-
Các khái niệm về vỏ Linux
-
Vỏ Bash là gì
-
Cấu trúc của Dòng lệnh
-
Khái niệm cơ bản về Trích dẫn
Các lệnh được dùng trong bài tập:
bash
-
Vỏ phổ biến nhất trên máy tính Linux.
echo
-
Xuất văn bản trên cửa sổ dòng lệnh.
ls
-
Liệt kê nội dung của một thư mục.
type
-
Chỉ ra cách một lệnh cụ thể được thực thi.
touch
-
Tạo một tệp trống hoặc cập nhật ngày sửa đổi của tệp hiện có.
hostname
-
Hiển thị hoặc thay đổi tên máy chủ của hệ thống.
Đáp án Bài tập Hướng dẫn
-
Hãy chia các dòng bên dưới thành các thành phần của lệnh, tùy chọn/ tham số và đối số:
-
ls -l /etc
Lệnh:
ls
Tuỳ chọn:
-l
Đối số:
/etc
-
ls -l -a
Lệnh:
ls
Tuỳ chọn:
-l -a
Đối số:
-
cd /home/user
Lệnh:
cd
Tuỳ chọn:
Đối số:
/home/user
-
-
Hãy cho biết các lệnh sau thuộc loại lệnh nào:
cd
Lệnh tích hợp sẵn của vỏ
cat
Lệnh bên ngoài
exit
Lệnh tích hợp sẵn của vỏ
-
Hãy giải quyết các lệnh sau sử dụng trích dẫn kép:
touch "$USER"
tom
touch 'touch'
Creates a file named
touch
Đáp án Bài tập Mở rộng
-
Hãy sử dụng một lệnh và phần mở rộng dấu ngoặc trong Bash (xem lại trang hướng dẫn về Bash), hãy tạo 5 tệp được đánh số từ 1 đến 5 với tiền tố
game
(game1
,game2
, …).Phạm vi có thể được sử dụng để thể hiện các số từ 1 đến 5 trong một lệnh:
$ touch game{1..5} $ ls game1 game2 game3 game4 game5
-
Hãy xóa tất cả 5 tệp mà bạn vừa tạo chỉ với một lệnh và một ký tự đặc biệt khác (xem lại phần Mở rộng Tên đường dẫn trong trang hướng dẫn của Bash).
Vì tất cả các tệp đều bắt đầu bằng
game
và kết thúc bằng một ký tự đơn (số từ 1 đến 5 trong trường hợp này) nên?
có thể được sử dụng làm ký tự đặc biệt cho ký tự cuối cùng trong tên tệp:$ rm game?
-
Có cách nào khác để làm cho hai lệnh tương tác với nhau không? Đó là những cách gì?
Có. Ví dụ, một lệnh có thể ghi dữ liệu vào một tệp, tệp này sau đó sẽ được xử lý bởi một lệnh khác. Linux cũng có thể thu thập đầu ra của một lệnh và sử dụng nó làm đầu vào cho một lệnh khác. Điều này được gọi là dẫn ống (piping) và chúng ta sẽ tìm hiểu thêm về nó trong bài học sau.