105.1 Bài 3
Chứng chỉ: |
LPIC-1 |
---|---|
Phiên bản: |
5.0 |
Chủ đề: |
105 Vỏ và Tệp lệnh Vỏ |
Mục tiêu: |
105.1 Tùy chỉnh và Sử dụng môi trường vỏ |
Bài: |
3 trên 3 |
Giới thiệu
Sau khi đã đi qua các khái niệm về vỏ, tệp lệnh khởi động và các biến trong những bài học trước, chúng ta sẽ kết thúc toàn bộ chủ đề về tùy chỉnh vỏ với hai phần tử rất thú vị của vỏ là bí danh và hàm. Trên thực tế, biến, bí danh và hàm — cũng như ảnh hưởng của chúng tới nhau — chính là những gì tạo nên môi trường vỏ.
Điểm mạnh chính của hai cơ sở rất linh hoạt và tiết kiệm thời gian này của vỏ chính là sự gói gọn: chúng cung cấp khả năng kết hợp — chỉ bằng một lệnh duy nhất — một loạt các lệnh định kỳ hoặc lặp đi lặp lại.
Tạo Bí danh
Bí danh là một tên khác dùng để thay thế cho (các) lệnh. Theo định nghĩa bí danh, nó có thể chạy như một lệnh thông thường nhưng sẽ thực thi một lệnh khác.
Cú pháp khai báo bí danh khá đơn giản. Bí danh sẽ được khai báo bằng từ khóa alias
, theo sau là phép gán bí danh. Việc gán bí danh sẽ bao gồm tên bí danh, một dấu bằng và một hoặc nhiều lệnh:
alias alias_name=command(s)
Ví dụ:
$ alias oldshell=sh
Bí danh này sẽ bắt đầu một phiên vỏ sh
ban đầu khi người dùng nhập oldshell
vào cửa sổ dòng lệnh:
$ oldshell $
Sức mạnh của bí danh nằm ở việc chúng giúp ta viết một phiên bản ngắn của các lệnh dài:
$ alias ls='ls --color=auto'
Note
|
Để biết thông tin về |
Tương tự như vậy, chúng ta có thể tạo bí danh cho một loạt các lệnh được nối liền nhau — dấu chấm phẩy (;
) sẽ được sử dụng làm dấu phân cách. Ví dụ: bí danh có thể cung cấp cho chúng ta thông tin về vị trí của tệp thực thi git
và phiên bản của nó:
$ alias git_info='which git;git --version'
Để gọi bí danh, chúng ta sẽ nhập tên của nó vào cửa sổ dòng lệnh:
$ git_info /usr/bin/git git version 2.7.4
Lệnh alias
sẽ tạo một danh sách tất cả các bí danh có sẵn trong hệ thống:
$ alias alias git-info='which git;git --version' alias ls='ls --color=auto' alias oldshell='sh'
Lệnh unalias
sẽ loại bỏ bí danh. Ví dụ: chúng ta có thể loại bỏ bí danh git-info
và xem nó biến mất khỏi danh sách như thế nào:
$ unalias git-info $ alias alias ls='ls --color=auto' alias oldshell='sh'
Như đã thấy với alias hi='echo We salute you.'
trong bài học trước, chúng ta phải đặt các lệnh trong dấu trích dẫn (đơn hoặc kép) khi — do có đối số hoặc tham số — chúng có chứa dấu cách :
$ alias greet='echo Hello world!' $ greet Hello world!
Các lệnh có dấu cách cũng bao gồm các lệnh có tùy chọn:
$ alias ll='ls -al'
Bây giờ, ll
sẽ liệt kê tất cả các tệp — bao gồm cả các tệp bị ẩn (a
) — ở định dạng chi tiết (l
).
Chúng ta có thể tham chiếu các biến trong bí danh:
$ reptile=uromastyx $ alias greet='echo Hello $reptile!' $ greet Hello uromastyx!
Biến cũng có thể được gán trong bí danh:
$ alias greet='reptile=tortoise; echo Hello $reptile!' $ greet Hello tortoise!
Chúng ta có thể thoát bí danh bằng \
:
$ alias where?='echo $PWD' $ where? /home/user2 $ \where? -bash: where?: command not found
Thoát bí danh rất hữu ích khi bí danh có cùng tên với một lệnh thông thường. Trong trường hợp này, bí danh sẽ được ưu tiên hơn lệnh ban đầu. Tuy nhiên, lệnh này vẫn có thể truy cập được bằng cách thoát bí danh.
Tương tự như vậy, chúng ta có thể đặt một bí danh bên trong một bí danh khác:
$ where? /home/user2 $ alias my_home=where? $ my_home /home/user2
Ngoài ra, chúng ta cũng có thể đặt một hàm bên trong bí danh như chúng ta sẽ thấy ở dưới đây.
Tính năng mở rộng và đánh giá của Dấu trích dẫn khi sử dụng với Bí danh
Khi sử dụng dấu trích dẫn với các biến môi trường, dấu trích dẫn đơn sẽ làm cho việc mở rộng trở nên động:
$ alias where?='echo $PWD' $ where? /home/user2 $ cd Music $ where? /home/user2/Music
Tuy nhiên, với dấu trích dẫn kép, việc mở rộng sẽ được thực hiện tĩnh:
$ alias where?="echo $PWD" $ where? /home/user2 $ cd Music $ where? /home/user2
Tính bền của Bí danh: Tệp lệnh khởi động
Cũng giống như các biến, để bí danh có được tính bền bỉ, ta phải đặt chúng vào các tệp lệnh khởi tạo được lấy nguồn khi khởi động. Như chúng ta đã biết, tệp phù hợp để người dùng đặt bí danh cá nhân là ~/.bashrc
. Ta cũng có thể sẽ tìm thấy một số bí danh có sẵn ở đó (hầu hết chúng đều đã được vô hiệu hoá dưới dạng chú thích và sẵn sàng được sử dụng bằng cách xóa #
ở đầu):
$ grep alias .bashrc # enable color support of ls and also add handy aliases alias ls='ls --color=auto' #alias dir='dir --color= #alias vdir='vdir --color= #alias grep='grep --color= #alias fgrep='fgrep --color' #alias egrep='egrep --color= # some more ls aliases #ll='ls -al' #alias la='ls -A' #alias l='ls -CF' # ~/.bash_aliases, instead of adding them here directly. if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases
Như có thể thấy trong ba dòng cuối cùng, hệ thống cho phép người dùng có một tệp dành riêng cho bí danh — ~/.bash_aliases
— và lấy nguồn cho nó từ .bashrc
mỗi khi hệ thống khởi động. Vì vậy, chúng ta có thể lựa chọn phương án này để tạo và điền vào tệp đó:
########### # .bash_aliases: # a file to be populated by the user's personal aliases (and sourced by ~/.bashrc). ########### alias git_info='which git;git --version' alias greet='echo Hello world!' alias ll='ls -al' alias where?='echo $PWD'
Tạo Hàm
So với bí danh, các hàm có tính lập trình và linh hoạt hơn, đặc biệt là trong việc khai thác toàn bộ tiềm năng của các biến tích hợp sẵn đặc biệt của Bash và các tham số vị trí. Chúng cũng làm việc rất tốt với các cấu trúc kiểm soát luồng như vòng lặp hoặc cấu trúc điều kiện. Chúng ta có thể coi hàm như một lệnh bao gồm logic thông qua các khối hoặc tập hợp các lệnh khác.
Hai cú pháp để tạo Hàm
Có hai cú pháp hợp lệ để xác định hàm.
- Sử dụng từ khóa
function
-
Một mặt, chúng ta có thể sử dụng từ khóa
function
, theo sau là tên hàm và các lệnh nằm trong ngoặc nhọn:function function_name { command #1 command #2 command #3 . . . command #n }
- Sử dụng
()
-
Mặt khác, chúng ta cũng có thể bỏ từ khóa
function
và thay vào đó là sử dụng hai dấu ngoặc đơn ngay sau tên của hàm:function_name() { command #1 command #2 command #3 . . . command #n }
Việc đặt các hàm trong tệp hoặc tệp lệnh là điều rất bình thường. Tuy nhiên, chúng cũng có thể được ghi trực tiếp vào dấu nhắc lệnh vỏ với mỗi lệnh trên một dòng khác nhau — lưu ý rằng PS2
(>
) biểu thị một dòng mới sau một dấu ngắt dòng:
$ greet() { > greeting="Hello world!" > echo $greeting > }
Dù trong trường hợp nào — và bất kể cú pháp chúng ta chọn là gì — , nếu chúng ta quyết định bỏ qua dấu ngắt dòng và viết một hàm chỉ trong một dòng thì các lệnh phải được phân tách bằng dấu chấm phẩy (hãy lưu ý cả dấu chấm phẩy ở sau lệnh cuối cùng):
$ greet() { greeting="Hello world!"; echo $greeting; }
bash
đã không hề có bất cứ phàn nàn gì khi chúng ta nhấn Enter, vì vậy nên hàm của chúng ta đã sẵn sàng được gọi. Để gọi một hàm, chúng ta phải nhập tên của nó vào cửa sổ dòng lệnh:
$ greet Hello world!
Cũng giống như các biến và bí danh, nếu muốn các hàm tồn tại bền bỉ trong suốt quá trình khởi động lại hệ thống, chúng ta phải đặt chúng vào các tệp lệnh khởi tạo vỏ như /etc/bash.bashrc
(toàn cục) hoặc ~/.bashrc
(cục bộ).
Warning
|
Sau khi thêm bí danh hoặc hàm vào bất kỳ tệp tập lệnh khởi động nào, chúng ta cũng nên cấp nguồn cho các tệp đó bằng |
Các Biến tích hợp sẵn đặc biệt của Bash
Vỏ Bourne Again đi kèm với một tập hợp các biến đặc biệt rất hữu ích cho các hàm và tệp lệnh. Chúng đặc biệt vì chỉ có thể được tham chiếu chứ không được chỉ định. Dưới đây là danh sách các biến quan trọng nhất:
$?
-
Tham chiếu của biến này sẽ mở rộng đến kết quả của lần chạy lệnh cuối cùng. Giá trị
0
có nghĩa là đã thành công:$ ps aux | grep bash user2 420 0.0 0.4 21156 5012 pts/0 Ss 17:10 0:00 -bash user2 640 0.0 0.0 12784 936 pts/0 S+ 18:04 0:00 grep bash $ echo $? 0
Giá trị khác
0
có nghĩa là đã gặp lỗi:user1@debian:~$ ps aux |rep bash -bash: rep: command not found user1@debian:~$ echo $? 127
$$
-
Biến mở rộng sang vỏ PID (ID tiến trình):
$ ps aux | grep bash user2 420 0.0 0.4 21156 5012 pts/0 Ss 17:10 0:00 -bash user2 640 0.0 0.0 12784 936 pts/0 S+ 18:04 0:00 grep bash $ echo $$ 420
$!
-
Biến mở rộng đến PID của tác vụ chạy ngầm cuối cùng:
$ ps aux | grep bash & [1] 663 $ user2 420 0.0 0.4 21156 5012 pts/0 Ss+ 17:10 0:00 -bash user2 663 0.0 0.0 12784 972 pts/0 S 18:08 0:00 grep bash ^C [1]+ Done ps aux | grep bash $ echo $! 663
NoteHãy nhớ rằng ký hiệu
&
được sử dụng để bắt đầu các tiến trình ở chế độ chạy ngầm. - Tham số vị trí từ
$0
đến$9
-
Chúng mở rộng sang các tham số hoặc đối số được truyền cho hàm (bí danh hoặc tệp lệnh) —
$0
mở rộng sang tên của tệp lệnh hoặc vỏ.Hãy tạo một hàm để thể hiện các tham số vị trí — lưu ý rằng
PS2
(>
) biểu thị các dòng mới sau dấu ngắt dòng:$ special_vars() { > echo $0 > echo $1 > echo $2 > echo $3 }
Bây giờ, chúng ta sẽ gọi hàm (
special_vars
) và truyền ba tham số cho nó (debian
,ubuntu
,zorin
):$ special_vars debian ubuntu zorin -bash debian ubuntu zorin
Nó đã hoạt động đúng như mong đợi.
WarningMặc dù việc truyền tham số vị trí cho bí danh về mặt kỹ thuật là hoàn toàn có thể nhưng nó lại hoàn toàn không có chức năng vì — với bí danh — tham số vị trí luôn được truyền ở cuối:
$ alias great_editor='echo $1 is a great text editor' $ great_editor emacs is a great text editor emacs
Các biến tích hợp sẵn đặc biệt khác của Bash bao gồm:
$#
-
Nó mở rộng đến số lượng đối số được truyền cho lệnh.
$@
,$*
-
Chúng mở rộng đến các đối số được truyền cho lệnh.
$_
-
Nó mở rộng đến tham số cuối cùng hoặc tên của tệp lệnh (hoặc nhiều hơn thế nữa - hãy xem
man bash
để tìm hiểu thêm!).
Biến trong Hàm
Tất nhiên, các biến cũng có thể được sử dụng trong hàm.
Để chứng minh cho điều này, chúng ta sẽ tạo một tệp trống mới có tên funed
và đặt hàm sau vào đó:
editors() { editor=emacs echo "My editor is: $editor. $editor is a fun text editor." }
Như có thể đoán được, trước tiên chúng ta phải lấy nguồn của tệp để có thể gọi hàm:
$ . funed
Và bây giờ chúng ta có thể kiểm tra nó:
$ editors My editor is emacs. emacs is a fun text editor.
Như có thể thấy, để hàm editors
hoạt động chính xác, trước tiên biến editor
phải được thiết lập. Phạm vi của biến đó là cục bộ trong vỏ hiện tại và chúng ta có thể tham chiếu nó trong giới hạn của phiên:
$ echo $editor emacs
Cùng với các biến cục bộ, chúng ta cũng có thể bao gồm cả các biến môi trường trong hàm của mình:
editors() { editor=emacs echo "The text editor of $USER is: $editor." } editors
Hãy lưu ý lần này chúng ta đã quyết định gọi hàm từ bên trong tệp (editors
ở dòng cuối cùng). Bằng cách này, khi chúng ta lấy nguồn của tệp, hàm này cũng sẽ được gọi cùng lúc:
$ . funed The text editor of user2 is: emacs.
Tham số vị trí trong Hàm
Điều tương tự cũng sẽ xảy ra với các tham số vị trí.
Chúng ta có thể truyền chúng đến các hàm từ bên trong tệp hoặc tệp lệnh (lưu ý dòng cuối cùng: editors tortoise
):
editors() { editor=emacs echo "The text editor of $USER is: $editor." echo "Bash is not a $1 shell." } editors tortoise
Chúng ta sẽ lấy nguồn tệp và chứng minh là nó hoạt động:
$ . funed The text editor of user2 is: emacs. Bash is not a tortoise shell.
Và chúng ta cũng có thể truyền tham số vị trí cho các hàm tại dòng lệnh. Để chứng minh điều này, hãy loại bỏ dòng cuối cùng của tệp:
editors() { editor=emacs echo "The text editor of $USER is: $editor." echo "Bash is not a $1 shell." }
Sau đó, chúng ta phải lấy nguồn tệp:
$ . funed
Cuối cùng, chúng ta gọi hàm với tortoise
làm tham số vị trí $1
tại dòng lệnh:
$ editors tortoise The text editor of user2 is: emacs. Bash is not a tortoise shell.
Hàm trong Tệp lệnh
Các hàm hầu hết có thể được tìm thấy trong các tệp lệnh Bash.
Việc biến tệp funed
của chúng ta thành một tệp lệnh (đặt tên là funed.sh
) là một việc rất dễ dàng:
#!/bin/bash editors() { editor=emacs echo "The text editor of $USER is: $editor." echo "Bash is not a $1 shell." } editors tortoise
Chính là như vậy! Chúng ta đã chỉ thêm hai dòng:
-
Dòng đầu tiên là shebang và nó sẽ xác định chương trình nào sẽ diễn giải tệp lệnh:
#!/bin/bash
. Thật kỳ lạ là bản thân chương trình đó lại chính làbash
. -
Dòng cuối cùng chỉ đơn giản là lời gọi hàm.
Bây giờ chỉ còn một việc — chúng ta phải làm cho tệp lệnh có thể thực thi được:
$ chmod +x funed.sh
Và bây giờ nó đã sẵn sàng để được thực thi:
$ ./funed.sh The text editor of user2 is: emacs. Bash is not a tortoise shell.
Note
|
Bạn sẽ tìm hiểu tất cả về tệp lệnh vỏ trong các bài học tiếp theo. |
Hàm trong Bí danh
Như đã nói ở trên, chúng ta có thể đặt một hàm bên trong một bí danh:
$ alias great_editor='gr8_ed() { echo $1 is a great text editor; unset -f gr8_ed; }; gr8_ed'
Giá trị bí danh dài này cần được giải thích. Hãy cùng chia nhỏ nó ra:
-
Đầu tiên là hàm:
gr8_ed() { echo $1 is a great text editor; unset -f gr8_ed; }
-
Lệnh cuối cùng trong hàm —
unset -f gr8_ed
— sẽ hủy thiết lập hàm để nó không còn trong phiênbash
hiện tại sau khi bí danh được gọi. -
Cuối cùng nhưng không kém phần quan trọng, để gọi bí danh thành công, trước tiên chúng ta cũng phải gọi hàm
gr8_ed
.
Hãy cùng gọi bí danh và chứng minh rằng nó sẽ hoạt động:
$ great_editor emacs emacs is a great text editor
Như được thể hiển trong unset -f gr8_ed
ở trên, lệnh unset
không chỉ được sử dụng để hủy đặt các biến mà còn cả các hàm. Trên thực tế, chúng ta có những khoá chuyển hoặc tùy chọn cụ thể:
unset -v
-
dành cho biến.
unset -f
-
dành cho hàm.
Nếu được sử dụng mà không có khoá chuyển, unset
sẽ cố gắng hủy đặt một biến trước tiên và — nếu thất bại — sau đó sẽ cố gắng hủy thiết lập một hàm.
Hàm trong Hàm
Bây giờ, giả sử chúng ta muốn thông báo hai điều với user2
mỗi khi họ đăng nhập vào hệ thống:
-
Chào hỏi và đề xuất/khen ngợi một trình soạn thảo văn bản.
-
Vì họ đang bắt đầu đặt nhiều tệp video
Matroska
vào thư mục$HOME/Video
của nó, chúng ta cần cảnh báo họ.
Để thực hiện điều đó, chúng ta đã đặt hai hàm sau vào /home/user2/.bashrc
:
Hàm đầu tiên (check_vids
) sẽ thực hiện kiểm tra các tệp .mkv
và cảnh báo:
check_vids() { ls -1 ~/Video/*.mkv > /dev/null 2>&1 if [ "$?" = "0" ];then echo -e "Remember, you must not keep more than 5 video files in your Video folder.\nThanks." else echo -e "You do not have any videos in the Video folder. You can keep up to 5.\nThanks." fi }
check_vids
sẽ thực hiện ba việc:
-
Nó liệt kê các tệp
mkv
trong~/Video
gửi đầu ra — và bất kỳ lỗi nào — đến nền tảng bit-bucket (/dev/null
). -
Nó kiểm tra kết quả đầu ra của lệnh trước đó xem có thành công hay không.
-
Tùy thuộc vào kết quả kiểm tra, nó sẽ lặp lại một trong hai thông báo.
Hàm thứ hai chính là một phiên bản sửa đổi của hàm editors
của chúng ta:
editors() { editor=emacs echo "Hi, $USER!" echo "$editor is more than a text editor!" check_vids } editors
Quan trọng nhất là phải quan sát hai yếu tố sau:
-
Lệnh cuối cùng của
editors
sẽ gọicheck_vids
để cả hai hàm xâu chuỗi với nhau: Lời chào, lời khen ngợi cũng như tác vụ kiểm tra và cảnh báo sẽ được thực hiện theo trình tự. -
Bản thân
editors
chính là điểm nhập của chuỗi hàm nên nó sẽ được gọi ở dòng cuối cùng (editors
).
Bây giờ, hãy đăng nhập với tên user2
và chứng minh rằng nó sẽ hoạt động:
# su - user2 Hi, user2! emacs is more than a text editor! Remember, you must not keep more than 5 video files in your Video folder. Thanks.
Bài tập Hướng dẫn
-
Hãy hoàn thành bảng với “Có” hoặc “Không” khi xem xét các tính năng của bí danh và hàm:
Tính năng Bí danh? Hàm? Biến cục bộ có thể được sử dụng
Biến môi trường có thể được sử dụng
Có thể thoát bằng
\
Có thể đệ quy
Rất hiệu quả khi được sử dụng với các tham số vị trí
-
Hãy nhập lệnh để liệt kê tất cả các bí danh trong hệ thống của bạn:
-
Hãy viết một bí danh có tên là
logg
để liệt kê tất cả các tệpogg
trong~/Music
— mỗi tệp trên một dòng: -
Hãy gọi bí danh để chứng minh rằng nó có hoạt động:
-
Bây giờ, hãy sửa đổi bí danh để nó hiển thị người dùng của phiên và một dấu hai chấm trước danh sách:
-
Hãy gọi lại lần nữa để chứng minh rằng phiên bản mới này cũng hoạt động:
-
Hãy liệt kê lại tất cả các bí danh và kiểm tra xem bí danh
logg
của bạn có xuất hiện trong danh sách hay không: -
Hãy xóa bí danh:
-
Hãy xem xét các cột “Tên bí danh” và “Lệnh được đặt Bí danh`” và gán chính xác bí danh cho các giá trị của chúng:
Tên bí danh Lệnh được đặt Bí danh Gán bí danh b
bash
bash_info
which bash
+echo "$BASH_VERSION"
kernel_info
uname -r
greet
echo Hi, $USER!
computer
pc=slimbook
+echo My computer is a $pc
-
Với tư cách là
root
, hãy viết một hàm có tênmy_fun
trong/etc/bash.bashrc
. Hàm phải chào người dùng và cho họ biết đường dẫn của họ là gì. Hãy gọi nó để người dùng nhận được cả hai thông báo mỗi khi họ đăng nhập: -
Hãy đăng nhập với tư cách là
user2
để kiểm tra xem nó có hoạt động hay không: -
Hãy viết hàm tương tự chỉ với một dòng:
-
Hãy gọi hàm:
-
Hãy huỷ thiết lập hàm:
-
Đây là phiên bản sửa đổi của hàm
special_vars
:$ special_vars2() { > echo $# > echo $_ > echo $1 > echo $4 > echo $6 > echo $7 > echo $_ > echo $@ > echo $? > }
Đây là lệnh chúng ta sử dụng để gọi nó:
$ special_vars2 crying cockles and mussels alive alive oh
Hãy dự đoán kết quả đầu ra:
Tham chiếu Giá trị echo $#
echo $_
echo $1
echo $4
echo $6
echo $7
echo $_
echo $@
echo $?
-
Dựa vào hàm mẫu (
check_vids
) trong phần “Hàm trong Hàm”, hãy viết một hàm có têncheck_music
để đưa vào tệp lệnh khởi độngbash
chấp nhận các tham số vị trí để chúng ta có thể sửa đổi nó một cách dễ dàng:-
loại tệp đang được kiểm tra:
ogg
-
thư mục lưu file:
~/Music
-
loại tệp đang được lưu giữ:
music
-
số lượng tệp đang được lưu:
7
-
Bài tập Mở rộng
-
Các hàm chỉ đọc (read-only) là những hàm mà chúng ta không thể sửa đổi nội dung của nó. Hãy tìm hiểu về hàm chỉ đọc và hoàn thành bảng sau:
Tên hàm Làm cho nó trở thành "chỉ đọc" Liệt kê tất cả các hàm chỉ đọc my_fun
-
Hãy tìm hiểu trên mạng cách sửa đổi
PS1
và bất kỳ điều gì khác mà bạn có thể cần để viết một hàm có tên làfyi
(được đặt trong tệp lệnh khởi động) cung cấp cho người dùng các thông tin sau:-
tên người dùng
-
thư mục chính
-
tên máy chủ
-
loại hệ điều hành
-
đường dẫn tìm kiếm tệp thực thi
-
thư mục email
-
tần suất kiểm tra email
-
độ "sâu" của phiên vỏ hiện tại (bao nhiêu vỏ)
-
dấu nhắc lệnh (bạn nên sửa đổi để nó hiển thị
<user>@<host-date>
)
-
Tóm tắt
Trong bài học này, chúng ta đã học về:
-
Cả bí danh và hàm đều là những tính năng quan trọng của vỏ cho phép chúng ta gói gọn các khối mã lặp lại.
-
Bí danh rất hữu ích trong việc giúp ta có được các phiên bản ngắn hơn của các lệnh dài và/hoặc phức tạp.
-
Hàm là các quy trình triển khai logic và cho phép chúng ta tự động hóa các tác vụ, đặc biệt khi được sử dụng trong các tệp lệnh.
-
Cú pháp viết bí danh và hàm.
-
Cách nối các lệnh khác nhau bằng dấu chấm phẩy (
;
). -
Cách sử dụng dấu trích dẫn đúng cách với bí danh.
-
Cách tạo bí danh và hàm bền vững.
-
Các biến tích hợp sẵn đặc biệt trong Bash:
$?
,$$
,$!
, tham số vị trí ($0
-$9
),$#
,$@
,$*
và$_
. -
Cách sử dụng biến và tham số vị trí với hàm.
-
Cách sử dụng các hàm trong tệp lệnh.
-
Cách gọi hàm từ bí danh.
-
Cách gọi hàm từ một hàm khác.
-
Những khái niệm cơ bản để tạo tệp lệnh
bash
.
Các lệnh và từ khóa được sử dụng trong bài học này:
alias
-
Tạo bí danh.
unalias
-
Loại bỏ bí danh.
cd
-
Thay đổi thư mục.
grep
-
In các dòng khớp với mẫu.
function
-
Từ khóa vỏ để tạo hàm.
.
-
Lấy nguồn một tệp.
source
-
Lấy nguồn một tệp.
ps
-
Báo cáo hình ảnh tức thời của các tiến trình hiện tại.
echo
-
Hiển thị một dòng văn bản.
chmod
-
Thay đổi các bit chế độ của một tệp (ví dụ như làm cho nó có thể thực thi được).
unset
-
Bỏ đặt các biến và hàm.
su
-
Thay đổi ID người dùng hoặc trở thành siêu người dùng.
Đáp án Bài tập Hướng dẫn
-
Hãy hoàn thành bảng với “Có” hoặc “Không” khi xem xét các tính năng của bí danh và hàm:
Tính năng Bí danh? Hàm? Biến cục bộ có thể được sử dụng
Có
Không
Biến môi trường có thể được sử dụng
Có
Có
Có thể thoát bằng
\
Có
Không
Có thể đệ quy
Có
Có
Rất hiệu quả khi được sử dụng với các tham số vị trí
Không
Có
-
Hãy nhập lệnh để liệt kê tất cả các bí danh trong hệ thống của bạn:
alias
-
Hãy viết một bí danh có tên là
logg
để liệt kê tất cả các tệpogg
trong~/Music
— mỗi tệp trên một dòng:alias logg='ls -1 ~/Music/*ogg'
-
Hãy gọi bí danh để chứng minh rằng nó có hoạt động:
logg
-
Bây giờ, hãy sửa đổi bí danh để nó hiển thị người dùng của phiên và một dấu hai chấm trước danh sách:
alias logg='echo $USER:; ls -1 ~/Music/*ogg'
-
Hãy gọi lại lần nữa để chứng minh rằng phiên bản mới này cũng hoạt động:
logg
-
Hãy liệt kê lại tất cả các bí danh và kiểm tra xem bí danh
logg
của bạn có xuất hiện trong danh sách hay không:alias
-
Hãy xóa bí danh:
unalias logg
-
Hãy xem xét các cột “Tên bí danh” và “Lệnh được đặt Bí danh” và gán chính xác bí danh cho các giá trị của chúng:
Tên bí danh Lệnh được đặt Bí danh Gán bí danh b
bash
alias b=bash
bash_info
which bash
+echo "$BASH_VERSION"
alias bash_info='which bash; echo "$BASH_VERSION"'
kernel_info
uname -r
alias kernel_info='uname -r'
greet
echo Hi, $USER!
alias greet='echo Hi, $USER'
computer
pc=slimbook
+echo My computer is a $pc
alias computer='pc=slimbook; echo My computer is a $pc'
NoteDấu trích dẫn đơn cũng có thể được thay thế bằng dấu trích dẫn kép.
-
Với tư cách là
root
, hãy viết một hàm có tênmy_fun
trong/etc/bash.bashrc
. Hàm phải chào người dùng và cho họ biết đường dẫn của họ là gì. Hãy gọi nó để người dùng nhận được cả hai thông báo mỗi khi họ đăng nhập:Lựa chọn A:
my_fun() { echo Hello, $USER! echo Your path is: $PATH } my_fun
Lựa chọn B:
function my_fun { echo Hello, $USER! echo Your path is: $PATH } my_fun
-
Hãy đăng nhập với tư cách là
user2
để kiểm tra xem nó có hoạt động hay không:su - user2
-
Hãy viết hàm tương tự chỉ với một dòng:
Lựa chọn A:
my_fun() { echo "Hello, $USER!"; echo "Your path is: $PATH"; }
Lựa chọn B:
function my_fun { echo "Hello, $USER!"; echo "Your path is: $PATH"; }
-
Hãy gọi hàm:
my_fun
-
Hãy huỷ thiết lập hàm:
unset -f my_fun
-
Đây là phiên bản sửa đổi của hàm
special_vars
:$ special_vars2() { > echo $# > echo $_ > echo $1 > echo $4 > echo $6 > echo $7 > echo $_ > echo $@ > echo $? > }
Đây là lệnh chúng ta sử dụng để gọi nó:
$ special_vars2 crying cockles and mussels alive alive oh
Hãy dự đoán kết quả đầu ra:
Tham chiếu Giá trị echo $#
7
echo $_
7
echo $1
crying
echo $4
mussels
echo $6
alive
echo $7
oh
echo $_
oh
echo $@
crying cockles and mussels alive alive oh
echo $?
0
-
Dựa vào hàm mẫu (
check_vids
) trong phần “Hàm trong Hàm”, hãy viết một hàm có têncheck_music
để đưa vào tệp lệnh khởi độngbash
chấp nhận các tham số vị trí để chúng ta có thể sửa đổi nó một cách dễ dàng:-
loại tệp đang được kiểm tra:
ogg
-
thư mục lưu file:
~/Music
-
loại tệp đang được lưu giữ:
music
-
số lượng tệp đang được lưu:
7
check_music() { ls -1 ~/$1/*.$2 > ~/.mkv.log 2>&1 if [ "$?" = "0" ];then echo -e "Remember, you must not keep more than $3 $4 files in your $1 folder.\nThanks." else echo -e "You do not have any $4 files in the $1 folder. You can keep up to $3.\nThanks." fi } check_music Music ogg 7 music
-
Đáp án Bài tập Mở rộng
-
Các hàm chỉ đọc (read-only) là những hàm mà chúng ta không thể sửa đổi nội dung của nó. Hãy tìm hiểu về hàm chỉ đọc và hoàn thành bảng sau:
Tên chức năng
Làm cho nó trở thành "chỉ đọc"
Liệt kê tất cả các hàm chỉ đọc
my_fun
readonly -f my_fun
readonly -f
-
Hãy tìm hiểu trên mạng cách sửa đổi
PS1
và bất kỳ điều gì khác mà bạn có thể cần để viết một hàm có tên làfyi
(được đặt trong tệp lệnh khởi động) cung cấp cho người dùng các thông tin sau:-
tên người dùng
-
thư mục chính
-
tên máy chủ
-
loại hệ điều hành
-
đường dẫn tìm kiếm tệp thực thi
-
thư mục email
-
tần suất kiểm tra email
-
độ "sâu" của phiên vỏ hiện tại (bao nhiêu vỏ)
-
dấu nhắc lệnh (bạn nên sửa đổi để nó hiển thị
<user>@<host-date>
)fyi() { echo -e "For your Information:\n Username: $USER Home directory: $HOME Host: $HOSTNAME Operating System: $OSTYPE Path for executable files: $PATH Your mail directory is $MAIL and is searched every $MAILCHECK seconds. The current level of your shell is: $SHLVL" PS1="\u@\h-\d " } fyi
-