1. Tổng quan

Trong bài viết này, chúng ta sẽ thảo luận về lệnh set trong Linux và các trường hợp sử dụng của nó. Chúng ta cũng sẽ xem xét một vài tùy chọn mà nó cung cấp và hiểu cách sử dụng chúng.

2. Lệnh Set

Chúng ta sử dụng lệnh set để thay đổi giá trị của các tùy chọn shell và hiển thị các biến trong file code Bash. Chúng ta cũng có thể sử dụng nó để debug các Bash file, xuất các giá trị từ tập lệnh shell, thoát chương trình khi chúng không thành công và xử lý các ngoại lệ.

Lệnh set định dạng sau:

$ set [option] [argument]

Ở đây, chúng ta sử dụng option để thiết lập hoặc bỏ đặt flag trong khi đối số là một tham số vị trí. Flag option tác động đến cách các tập lệnh Bash hành xử để hoàn thành bất kỳ nhiệm vụ mong muốn nào.

Khi chúng ta chạy lệnh set mà không có bất kỳ đối số nào, nó trả về một danh sách tất cả các cài đặt hệ thống. Danh sách bao gồm tên và giá trị của tất cả các biến shell và hàm:

$ set
HISTFILE='/root/.ash_history'
HOME='/root'
HOSTNAME='localhost'
IFS=' '
LINENO=''
OLDPWD='/'
OPTIND='1'
PAGER='less' PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
PPID='1'
PS1='\h:\w\$ '
PS2='> '
PS4='+ '
PWD='/root'
SHLVL='3'
TERM='linux'
TZ='UTC-01:00' _='--version'
script='/etc/profile.d/*.sh'

Vì danh sách dài, chúng ta có thể sử dụng phím Page Up và Page Down để điều hướng qua nó.

3. tùy chọn lệnh set

Chúng ta có một số tùy chọn chúng ta có thể sử dụng với lệnh set. Chúng ta sẽ thảo luận về những cái phổ biến nhất trong phần này.

3.1. Tùy chọn -e

Khi các câu lệnh trong file bash trả về trạng thái không bằng 0, option e sẽ dừng tập lệnh. Nó cũng phát hiện lỗi trong tập lệnh hiện đang thực thi.

Hãy viết một tập lệnh Bash hiển thị nội dung của một tệp và xuất ra một thông báo nếu tệp tồn tại trong thư mục của chúng ta:

#!/bin/bash 
set -e 
mkdir newfolder 
cat filenotindirectory 
echo 'The file is not in our directory!'

Chúng ta chạy tệp thực thi để kiểm tra flag -e:

$ chmod u+x eflag.sh
$ ./eflag.sh
cat: can't open 'filenotindirectory': No such file or directory

Khi tập lệnh cố gắng hiển thị nội dung của tệp filenotindirectory, nó lỗi vì tệp không tồn tại và nó thoát ra ngay lập tức. Do đó, lệnh echo cuối cùng cũng không được chạy.

3.2. Tùy chọn -C

Sử dụng -C đảm bảo rằng chúng ta không thể ghi đè lên một file hiện có có cùng tên:

$ echo 'An existing file' > myfile
$ set -C
$ echo 'Editing an existing file' > myfile
sh: can't create myfile: File exists

Chúng ta đã tạo một tệp có tên myfile, nhưng đã xảy ra lỗi khi chúng ta cố gắng ghi đè lên nội dung của nó. Sử dụng tùy chọn này là một thực hành tốt để tránh vô tình ghi đè lên các tệp.

3.3. Tùy chọn -f

Như chúng ta đã biết, chúng ta có thể dễ dàng tìm kiếm các tệp bằng các ký tự đại diện như ? ,*, hoặc []. Phương pháp này tương tự như regex, nơi chúng ta cố gắng tìm các văn bản tương tự bằng cách sử dụng các pattern. Bash shell sử dụng các ký tự đại diện mà chúng ta chỉ định để tạo các mẫu và khớp chúng với tên tệp. Tính năng này được gọi là globbing.

Hãy thử sử dụng globbing bằng cáchtìm kiếm các tệp có phần mở rộng .txt:

$ ls *.txt
files.txt

Chúng ta có thể thấy rằng có một tệp có các tệp . phần mở rộng txt.

Tiếp theo, hãy chạy lệnh set -f và sau đó tìm kiếm các tệp có phần mở rộng .txt bằng ký tự đại diện:

$ set -f
$ ls *.txt
ls: *.txt: No such file or directory

Bây giờ chúng ta nhận được một lỗi như đầu ra. -f ngăn chúng ta sử dụng ký tự đại diện để tìm kiếm tên tệp hoặc chuỗi.

Chúng ta cần lưu ý rằng việc chạy lệnh ls mà không chỉ định bất kỳ mẫu ký tự đại diện nào vẫn sẽ cung cấp đầu ra của tất cả các tệp trong thư mục của chúng ta.

3.4. Tùy chọn -x

Chúng ta sử dụng tham số -x khi debug các tập lệnh của mình để xác định đầu ra của các lệnh riêng lẻ.

Để minh họa, hãy tạo một tập lệnh Bash hiển thị đếm ngược từ 3 đến 0:

#!/bin/bash
set -x
n=3
while [ $n -gt 0 ]; do
    n=$[ $n-1 ]
    echo $n
    sleep 1
done

Sau đó, chúng ta thực thi tập lệnh:

$ bash debugging.sh
+ n=3
+ '[' 3 -gt 0 ']'
+ n=2
+ echo 2
2
+ sleep 1
+ '[' 2 -gt 0 ']'
+ n=1
+ echo 1
1
+ sleep 1
+ '[' 1 -gt 0 ']'
+ n=0
+ echo 0
0
+ sleep 1
+ '[' 0 -gt 0 ']'

Chúng ta có thể thấy rằng code thực thi từng dòng một, hiển thị kết quả trước khi chuyển sang dòng sau.

3.5.Tùy chọn -A

Chúng ta có thể xuất các biến hoặc hàm bằng flag này, làm cho chúng có thể tái sử dụng trong các tập lệnh con hoặc tập lệnh. Đầu tiên, hãy định nghĩa các biến trong terminal của chúng ta:

$ set -a 
$ name='May' 
$ age=22

Tiếp theo, chúng ta viết một kịch bản:

#!/bin/bash 
echo $name $age

Cuối cùng, hãy chạy script:

$ bash export.sh 
May 22

Chúng ta có thể thấy ở trên rằng tập lệnh xuất ra các biến đã tạo, như được xác định bởi lệnh echo.

Ngoài ra, chúng ta cũng có thể chạy lệnh set này theo trình tự sau:

$ name='May' 
$ age=22

Tiếp theo, chúng ta viết kịch bản:

#!/bin/bash 
echo $name $age

Cuối cùng, chúng ta chạy script:

$ bash export.sh -a 
May 22

3.6. Tùy chọn -u

Chúng ta sử dụng cờ này để đảm bảo rằng Bash không bỏ qua các biến không tồn tại trong tập lệnh của chúng ta. Chúng ta có thể thấy rằng trong những trường hợp bình thường, Bash bỏ qua các biến chưa được gán và chạy tập lệnh của chúng ta mà không có bất kỳ lỗi nào:

#!/bin/bash
x='Bash scripting is fun'
echo $x $y

Hãy làm cho tập lệnh thành một tệp thực thi và sau đó chạy nó:

$ chmod u+x testfile.sh
$ ./testfile.sh
Bash scripting is fun

Bây giờ, chúng ta áp dụng lệnh set với tùy chọn -u:

#!/bin/bash
set -u
x='Bash scripting is fun'
echo $x $y

Hãy chạy lại tập lệnh:

$ ./testfile.sh
./testfile.sh: line 4: y: unbound variable

Chúng ta thấy rằng chúng ta đã nhận được một lỗi. Tùy chọn -u ngăn Bash bỏ qua biến không tồn tại.

3.7. Tùy chọn +[argument]

Chạy lệnh set với tùy chọn +[argument], bỏ đặt chức năng của tùy chọn. Về bản chất, nó vô hiệu hóa hiệu ứng của tùy chọn -[argument].

Chúng ta sẽ thấy một số ví dụ về các tập lệnh shell chạy với các lệnh set +[argument] và kết quả đầu ra của chúng.

Đầu tiên, chúng ta xem xét set +e:

#!/bin/bash
set +e
mkdir newfolder
cat filenotindirectory
echo 'The file is not in our directory!'

Bây giờ, hãy làm cho tập lệnh của chúng ta thành một tệp thực thi và chạy nó:

$ chmod u+x test.sh
$ ./test.sh
cat: filenotfoundindirectory: No such file or directory
The file is not in our directory!

Tập lệnh Bash xuất ra lỗi và vẫn tiếp tục in ra lệnh echo.

Tiếp theo là tùy chọn set +C. Đầu tiên, chúng ta thêm nội dung vào một tệp mới có tên myfile:

$ echo 'An existing file' > myfile
$ ls
eflag.sh myfile

Tiếp theo, chúng ta cố gắng ghi đè lên myfile hiện có:

$ set +C
$ echo 'Editing an existing file' > myfile
localhost:~# ls
eflag.sh myfile

Chúng ta nhận thấy rằng chúng ta có thể ghi đè lên các tệp hiện có.

Thứ ba, chúng ta xem xét tùy chọnset +f:

$ set +f
$ ls *.txt
files.txt

Bằng cách chạy lệnh này, chúng ta có thể tìm kiếm các tệp bằng cách sử dụng các mẫu ký tự đại diện.

Tiếp theo là tùy chọn set +x:

#!/bin/bash
set +x
n=3
while [ $n -gt 0 ]; do
  n=$[ $n-1 ]
  echo $n
  sleep 1
done

Hãy thực thi tập lệnh:

$ chmod u+x debuggingflag.sh
$ bash debuggingflag.sh
2
1
0

Chúng ta xem đầu ra theo tốc độ được đặt bởi lệnh sleep, nhưng nếu chúng ta gặp lỗi trong code, đầu ra sẽ không hiển thị bất kỳ thông báo debug nào.

Cuối cùng, chúng ta quan sát lệnh set +a:

$ set +a
$ name=’May’
$ age=22

Hãy tạo một tập lệnh lặp lại các biến:

#!/bin/bash
echo $name $age

Bây giờ, chúng ta chạy script của chúng ta:

$ bash export.sh

Chúng ta nhận được một đầu ra trống, vì không có giá trị nào được gán cho các biến trong tệp export.sh.

4. Kết luận

Trong bài viết này, chúng ta đã thấy cách lệnh set cung cấp cho chúng ta quyền kiểm soát hành vi của các tập lệnh bằng cách cho phép chúng ta quản lý các flag và đặc điểm nhất định. Các lệnh này rất cần thiết vì chúng cho phép chúng ta bảo vệ các tập lệnh của mình và đảm bảo rằng chúng hoạt động như dự định.

Lệnh set có nhiều tùy chọn, nhưng những tùy chọn được đề cập trong bài viết này là một trong những tùy chọn được sử dụng nhiều nhất.

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments