Giới thiệu
Trong lab này, bạn sẽ học cách sử dụng lệnh set
trong Linux để quản lý các biến và tùy chọn shell. Lab này bao gồm việc hiểu mục đích và cú pháp của lệnh set
, sửa đổi các biến shell và quản lý các biến môi trường. Lệnh set
là một công cụ mạnh mẽ để cấu hình và tùy chỉnh môi trường shell, và các ví dụ thực tế được cung cấp trong lab này sẽ giúp bạn thành thạo trong việc sử dụng nó.
Hiểu Mục Đích và Cú Pháp của Lệnh set
Trong bước này, bạn sẽ tìm hiểu về mục đích và cú pháp của lệnh set
trong Linux. Lệnh set
được sử dụng để thiết lập, hủy thiết lập và hiển thị các biến và tùy chọn shell.
Đầu tiên, hãy khám phá cú pháp của lệnh set
:
set [option] [variable[=value]]
Ở đây, option
đại diện cho các tùy chọn khác nhau có thể được sử dụng với lệnh set
, và variable[=value]
đại diện cho biến shell mà bạn muốn thiết lập hoặc hủy thiết lập.
Một số tùy chọn phổ biến được sử dụng với lệnh set
bao gồm:
-a
: Tự động đánh dấu các biến được sửa đổi hoặc tạo để xuất sang môi trường của các lệnh tiếp theo.-e
: Thoát ngay lập tức nếu một lệnh thoát với trạng thái khác 0.-u
: Coi các biến chưa được thiết lập là một lỗi khi thay thế.-x
: In các lệnh và đối số của chúng khi chúng được thực thi.
Để hiển thị tất cả các biến shell hiện được thiết lập, bạn có thể chỉ cần chạy lệnh set
mà không có bất kỳ đối số nào:
set
Ví dụ đầu ra:
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="5" [1]="1" [2]="4" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='5.1.4(1)-release'
COLUMNS=80
COMP_WORDBREAKS=$' \t\n"\'><=;|&(:'
DIRSTACK=()
EUID=1000
GROUPS=()
HISTCONTROL=ignoreboth
HISTFILE=/home/labex/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/labex
HOSTNAME=8d5d8d1f0a3f
HOSTTYPE=x86_64
IFS=$' \t\n'
LANG=en_US.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LINES=24
LOGNAME=labex
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:'
MACHTYPE=x86_64-pc-linux-gnu
MAILCHECK=60
OLDPWD=/home/labex
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
PIPESTATUS=([0]="0")
PPID=1
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
PS2='> '
PS4='+ '
PWD=/home/labex/project
RANDOM=1836
READLINE_LINE=
READLINE_POINT=0
SHELL=/bin/bash
SHELLOPTS=braceexpand:hashall:interactive-comments:progcomp
SHLVL=1
SSH_CLIENT='172.17.0.1 52390 22'
SSH_CONNECTION='172.17.0.1 52390 172.17.0.2 22'
SSH_TTY=/dev/pts/0
TERM=xterm-256color
UID=1000
UPTIME_DAYS=0
UPTIME_HOURS=0
UPTIME_MINUTES=2
UPTIME_SECONDS=123
USER=labex
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
XDG_RUNTIME_DIR=/run/user/1000
XDG_SESSION_ID=1
_=/usr/bin/env
Như bạn có thể thấy, lệnh set
hiển thị tất cả các biến shell hiện được thiết lập, bao gồm cả các biến môi trường và các tùy chọn shell.
Bây giờ, hãy khám phá cách sử dụng lệnh set
để quản lý các biến và tùy chọn shell.
Sửa Đổi Biến Shell Bằng Lệnh set
Trong bước này, bạn sẽ học cách sửa đổi các biến shell bằng lệnh set
.
Đầu tiên, hãy tạo một biến shell mới:
set MYVAR="Hello, World!"
Bây giờ, hãy xác minh rằng biến đã được tạo chính xác:
echo $MYVAR
Ví dụ đầu ra:
Hello, World!
Bạn cũng có thể sử dụng lệnh set
để sửa đổi giá trị của một biến shell hiện có:
MYVAR="Goodbye, World!"
set MYVAR
Ví dụ đầu ra:
MYVAR="Goodbye, World!"
Để hủy thiết lập một biến shell, bạn có thể sử dụng tùy chọn -u
với lệnh set
:
set -u MYVAR
echo $MYVAR
Ví dụ đầu ra:
bash: MYVAR: unbound variable
Như bạn có thể thấy, biến MYVAR
hiện đã bị hủy thiết lập và việc cố gắng truy cập nó sẽ dẫn đến lỗi.
Cuối cùng, hãy khám phá cách làm cho một biến shell chỉ đọc bằng tùy chọn -a
:
set -a READONLY_VAR="This variable is read-only"
READONLY_VAR="New value"
Ví dụ đầu ra:
bash: READONLY_VAR: readonly variable
Trong ví dụ này, chúng ta đã làm cho biến READONLY_VAR
chỉ đọc và việc cố gắng sửa đổi giá trị của nó đã dẫn đến lỗi.
Quản Lý Biến Môi Trường với Lệnh set
Trong bước này, bạn sẽ học cách quản lý các biến môi trường bằng lệnh set
.
Các biến môi trường là một loại biến shell đặc biệt có thể truy cập được đối với tất cả các tiến trình đang chạy trong hệ thống. Chúng thường được sử dụng để lưu trữ các cài đặt cấu hình, đường dẫn và các thông tin quan trọng khác.
Hãy bắt đầu bằng cách hiển thị các biến môi trường hiện tại:
set -o | grep -E '^[a-Z_]+='
Ví dụ đầu ra:
BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d
HISTCONTROL=ignoreboth
HISTFILE=/home/labex/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/labex
HOSTNAME=8d5d8d1f0a3f
LANG=en_US.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LOGNAME=labex
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:'
MACHTYPE=x86_64-pc-linux-gnu
MAILCHECK=60
OLDPWD=/home/labex
OPTERR=1
OPTIND=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
PIPESTATUS=([0]="0")
PPID=1
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
PS2='> '
PS4='+ '
PWD=/home/labex/project
RANDOM=1836
SHELL=/bin/bash
SHELLOPTS=braceexpand:hashall:interactive-comments:progcomp
SHLVL=1
SSH_CLIENT='172.17.0.1 52390 22'
SSH_CONNECTION='172.17.0.1 52390 172.17.0.2 22'
SSH_TTY=/dev/pts/0
TERM=xterm-256color
UID=1000
USER=labex
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
XDG_RUNTIME_DIR=/run/user/1000
XDG_SESSION_ID=1
_=/usr/bin/env
Như bạn có thể thấy, đầu ra bao gồm một danh sách tất cả các biến môi trường hiện được thiết lập trong hệ thống.
Bây giờ, hãy tạo một biến môi trường mới:
export MYENV_VAR="This is an environment variable"
Để xác minh rằng biến đã được tạo chính xác, chúng ta có thể sử dụng lệnh echo
:
echo $MYENV_VAR
Ví dụ đầu ra:
This is an environment variable
Để làm cho một biến môi trường chỉ đọc, bạn có thể sử dụng lệnh readonly
:
readonly READONLY_ENV_VAR="This variable is read-only"
READONLY_ENV_VAR="New value"
Ví dụ đầu ra:
bash: READONLY_ENV_VAR: readonly variable
Như bạn có thể thấy, việc cố gắng sửa đổi biến READONLY_ENV_VAR
đã dẫn đến lỗi.
Tóm tắt
Trong lab này, bạn đã tìm hiểu về mục đích và cú pháp của lệnh set
trong Linux. Lệnh set
được sử dụng để thiết lập, hủy thiết lập và hiển thị các biến và tùy chọn shell. Bạn đã khám phá các tùy chọn khác nhau có thể được sử dụng với lệnh set
, chẳng hạn như -a
, -e
, -u
và -x
, và cách hiển thị tất cả các biến shell hiện được thiết lập bằng cách chạy lệnh set
mà không có bất kỳ đối số nào.
Bạn cũng đã học cách quản lý các biến môi trường với lệnh set
, cho phép bạn sửa đổi các biến shell và kiểm soát hành vi của chúng trong môi trường shell.