BÀI VIẾT

Hướng dẫn sử dụng biến môi trường trong Linux

2.8K
author Huỳnh Đình Hiếu - 2022-08-05 16:44:01 (GMT+7)

Giới thiệu

Biến môi trường là các đại lượng có các giá trị cụ thể. Một số biến môi trường được cung cấp các giá trị đặt trước của hệ thống và các biến khác được đặt trực tiếp bởi người dùng, tại dòng lệnh hoặc trong khi khởi động các tập lệnh khác.

Các biến môi trường cho phép bạn tùy chỉnh cách hệ thống hoạt động và hành vi của các ứng dụng trên hệ thống.

Biến môi trường là một chuỗi ký tự chứa thông tin được sử dụng bởi một hoặc nhiều ứng dụng.

Liệt kê các biến môi trường

Có một số lệnh có sẵn cho phép bạn liệt kê và đặt các biến môi trường trong Linux như sau:

  • env - Lệnh cho phép bạn chạy chương trình khác trong môi trường tùy chỉnh mà không cần sửa đổi chương trình hiện tại. Khi được sử dụng mà không có đối số, nó sẽ in ra danh sách các biến môi trường hiện tại.

  • printenv - Lệnh in ra tất cả hoặc các biến môi trường được chỉ định.

  • set - Lệnh đặt hoặc bỏ thiết lập các biến shell. Khi được sử dụng mà không có đối số, nó sẽ in ra danh sách tất cả các biến bao gồm các biến môi trường và biến shell và các hàm shell.

  • unset - Lệnh xóa các biến shell và môi trường.

  • export - Lệnh thiết lập các biến môi trường.

Lệnh được sử dụng nhiều nhất để hiển thị các biến môi trường là printenv. Nếu tên của biến được chuyển làm đối số cho lệnh, thì chỉ giá trị của biến đó được hiển thị. Nếu không có đối số nào được chỉ định, printenv sẽ in danh sách tất cả các biến môi trường, một biến trên mỗi dòng.

Ví dụ: để hiển thị giá trị của biến môi trường HOME, chúng ta sẽ chạy:

bash (non-root)
printenv HOME
/root

Đầu ra sẽ là đường dẫn của người dùng hiện đang đăng nhập /root.

Nếu chúng ta chạy lệnh printenv hoặc env mà không có bất kỳ đối số nào, nó sẽ hiển thị danh sách tất cả các biến môi trường.

bash (non-root)
printenv
SHELL=/bin/bash
PWD=/root
LOGNAME=root
XDG_SESSION_TYPE=tty
MOTD_SHOWN=pam
HOME=/root
LANG=C.UTF-8
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:*.webp=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:
SSH_CONNECTION=113.173.184.41 54259 61.14.233.29 2018
LESSCLOSE=/usr/bin/lesspipe %s %s
XDG_SESSION_CLASS=user
TERM=xterm
LESSOPEN=| /usr/bin/lesspipe %s
USER=root
SHLVL=1
XDG_SESSION_ID=37
XDG_RUNTIME_DIR=/run/user/0
SSH_CLIENT=192.168.121.1 34422 22
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus
SSH_TTY=/dev/pts/0
_=/usr/bin/printenv

Dưới đây là một số biến môi trường phổ biến nhất:

  • USER - Người dùng đã đăng nhập hiện tại.

  • HOME - Thư mục chính của người dùng hiện tại.

  • EDITOR - Trình chỉnh sửa tệp mặc định được sử dụng. Đây là trình chỉnh sửa sẽ được sử dụng khi bạn nhập chỉnh sửa trong thiết bị đầu cuối của mình.

  • SHELL - Đường dẫn của shell của người dùng hiện tại, chẳng hạn như bash hoặc zsh.

  • LOGNAME - Tên của người dùng hiện tại.

  • PATH - Danh sách các thư mục được tìm kiếm khi thực hiện các lệnh. Khi bạn chạy một lệnh, hệ thống sẽ tìm kiếm các thư mục đó theo thứ tự này và sử dụng tệp thực thi được tìm thấy đầu tiên.

  • LANG - Cài đặt ngôn ngữ hiện tại.

  • TERM - Mô phỏng thiết bị đầu cuối hiện tại.

  • MAIL - Vị trí nơi lưu trữ thư của người dùng hiện tại.

Lệnh printenvenv chỉ in các biến môi trường. Nếu chúng ta muốn nhận danh sách tất cả các biến, bao gồm môi trường, shell và các biến, và các hàm shell, chúng ta có thể sử dụng lệnh set:

bash (non-root)
set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extquote:force_fignore:globasciiranges:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=([0]="0")
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="5" [1]="1" [2]="16" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='5.1.16(1)-release'
COLUMNS=225
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus
DIRSTACK=()
EUID=0
GROUPS=()
HISTCONTROL=ignoredups:ignorespace
HISTFILE=/root/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/root
HOSTNAME=vps02
HOSTTYPE=x86_64
IFS=$' \t\n'
LANG=C.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LINES=59
LOGNAME=root
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:*.webp=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
MOTD_SHOWN=pam
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=616374
PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
PS2='> '
PS4='+ '
PWD=/root
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='192.168.121.1 34422 22'
SSH_CONNECTION='192.168.121.1 34422 22'
SSH_TTY=/dev/pts/0
TERM=xterm
UID=0
USER=root
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_CLASS=user
XDG_SESSION_ID=37
XDG_SESSION_TYPE=tty
_=clear
snap_bin_path=/snap/bin
snap_xdg_path=/var/lib/snapd/desktop
gawklibpath_append ()
{
    [ -z "$AWKLIBPATH" ] && AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`;
    export AWKLIBPATH="$AWKLIBPATH:$*"
}
gawklibpath_default ()
{
    unset AWKLIBPATH;
    export AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`
}
gawklibpath_prepend ()
{
    [ -z "$AWKLIBPATH" ] && AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`;
    export AWKLIBPATH="$*:$AWKLIBPATH"
}
gawkpath_append ()
{
    [ -z "$AWKPATH" ] && AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`;
    export AWKPATH="$AWKPATH:$*"
}
gawkpath_default ()
{
    unset AWKPATH;
    export AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`
}
gawkpath_prepend ()
{
    [ -z "$AWKPATH" ] && AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`;
    export AWKPATH="$*:$AWKPATH"
}

Chúng ta cũng có thể dùng lệnh echo để in một biến shell, ví dụ chúng ta muốn in giá trị của biến BASH_VERSION chúng ta dùng lệnh như sau:

bash (non-root)
echo $BASH_VERSION
5.1.16(1)-release

Đặt biến môi trường

Để hiểu rõ hơn sự khác biệt giữa các biến Shell và Environment, chúng ta sẽ bắt đầu với việc thiết lập các biến Shell và sau đó chuyển sang các biến môi trường.

Để tạo một biến shell với tên MY_VAR và giá trị 123host.vn chúng ta gõ lệnh như sau:

bash (non-root)
MY_VAR='123host.vn'

Chúng ta có thể xác minh rằng biến được đặt bằng cách sử dụng echo $ MY_VAR

bash (non-root)
echo $MY_VAR
123host.vn

Chúng ta sử dụng lệnh printenv để kiểm tra xem biến này có phải là biến môi trường hay không

bash (non-root)
printenv MY_VAR

Đầu ra trống cho chúng ta biết rằng biến không phải là biến môi trường.

Lệnh export được sử dụng để thiết lập các biến môi trường.

Để tạo một biến môi trường, chỉ cần xuất biến shell dưới dạng một biến môi trường như sau:

bash (non-root)
export MY_VAR

Chúng ta có thể kiểm tra bằng cách chạy lệnh sau:

bash (non-root)
printenv MY_VAR
123host.vn

Chúng ta cũng có thể đặt biến môi trường trong một dòng như sau:

bash (non-root)
export NAME="Value"

Các biến môi trường được tạo theo cách này chỉ có sẵn trong phiên hiện tại. Nếu chúng ta mở một trình shell mới hoặc nếu chúng ta đăng xuất, tất cả các biến sẽ bị mất.

Biến môi trường liên tục

Để làm cho các biến môi trường bền vững, chúng ta cần xác định các biến đó trong tệp cấu hình bash. Trong hầu hết các bản phân phối Linux khi chúng ta bắt đầu một phiên mới, các biến môi trường được đọc từ các tệp sau:

  • /etc/environment - Sử dụng tệp này để thiết lập các biến môi trường trên toàn hệ thống. Các biến trong tệp này được đặt ở định dạng sau:
/etc/environment
FOO=bar
VAR_TEST="Test Var"
  • /etc/profile - Các biến được đặt trong tệp này được tải bất cứ khi nào đăng nhập bash shell được nhập. Khi khai báo các biến môi trường trong tệp này, chúng ta cần sử dụng lệnh export:
/etc/profile
export JAVA_HOME="/path/to/java/home"
export PATH=$PATH:$JAVA_HOME/bin
  • Các tệp cấu hình cụ thể shell cho mỗi người dùng. Ví dụ: nếu bạn đang sử dụng Bash, chúng ta có thể khai báo các biến trong ~ / .bashrc:
/root/.bashrc
export PATH="$HOME/bin:$PATH"

Để tải các biến môi trường mới vào phiên shell hiện tại, hãy sử dụng lệnh source:

bash (non-root)
source ~/.bashrc

Xóa biến môi trường

Để bỏ đặt biết môi trường chúng ta dùng lệnh unset như sau:

bash (non-root)
unset MY_VAR

Hoặc chúng ta có thể dùng

bash (non-root)
MY_VAR=''

Tổng kết

Trong bài viết này chúng ta đã tìm hiểu về biến môi trường trên Linux. Hy vọng bài viết này sẽ giúp các bạn hiểu rỏ hơn về biến môi trường trong Linux


Bạn có làm được theo hướng dẫn này không?

Bài liên quan

Lệnh xác định vị trí của tệp hoặc thư mục trên Linux
Lệnh xác định vị trí của tệp hoặc thư mục trên Linux
Lệnh kiểm tra nhiều cổng port đang mở của một tên miền trên Linux
Lệnh kiểm tra nhiều cổng port đang mở của một tên miền trên Linux
Lệnh tạo một dãy số tăng dần trên Linux
Lệnh tạo một dãy số tăng dần trên Linux

Object Storage

Chuẩn S3, không giới hạn băng thông

Object Storage

Thuê Server Riêng

Chi phí thấp, cấu hình cao

Thuê Server Riêng
Thông tin tác giả
Bình luận

Tính năng đang được phát triển

Đang tải bình luận
Liên hệ chúng tôi