Trong tin học, một biến là từ thay thế cho giá trị có thể thay đổi. Bạn dùng biến hàng ngày trong lời nói bình thường, dù không nghĩ chúng là biến. Khi nói "xe của tôi", bạn dùng "xe của tôi" như một biến tham chiếu đến xe bạn sở hữu lúc đó. Hãng và mẫu chắc chắn thay đổi suốt đời khi thay xe cũ bằng mới, nhưng bằng cách tạo biến "xe của tôi" bạn không phải唠叨 về loại xe bạn hiện sở hữu mỗi khi muốn đề cập đến xe.
Trên máy tính, biến dùng cách tương tự.
Ví dụ, bất kỳ ai có tài khoản người dùng trên máy tính có thư mục home nơi máy lưu dữ liệu cá nhân. Nhưng mỗi user có thư mục home riêng (/home/seth cho Seth, /home/tux cho Tux, v.v. cho mỗi user), nên khi muốn tham chiếu chung đến thư mục home, bạn dùng biến $HOME chỉ thư mục home của người dùng hiện tại, bất kể tên đăng nhập.
Biến môi trường là biến đặc biệt (như $HOME) chứa thông tin phiên đăng nhập. Chúng lưu trữ cho shell hệ thống dùng khi thực thi lệnh. Chúng tồn tại dù bạn dùng Linux, Mac, Windows. Nhiều biến được đặt mặc định khi cài đặt hoặc tạo user.
Mặc dù biến môi trường áp dụng cho mọi hệ thống hiện đại, bài này cụ thể nói về biến môi trường trong shell Bash trên Linux, BSD, Mac, Cygwin.
Hiểu biến môi trường
Biến môi trường về mặt kỹ thuật không khác biến thường. Chúng có thể đặt, gọi, xóa với đúng cú pháp dùng cho biến. Nếu chưa quen dùng biến Bash, đọc bài biến Bash của tôi trước.
Bạn không thường dùng biến môi trường trực tiếp. Chúng được tham chiếu bởi ứng dụng và daemon riêng lẻ khi cần. Ví dụ, thư mục home được đặt làm biến môi trường khi đăng nhập. Trên Linux, xem nội dung biến môi trường HOME:
$ echo $HOME
HOME=/home/seth
Trên Mac:
$ echo $HOME
HOME=/Users/bogus
Trên Windows:
C:\Users\bogus
Bạn xem tất cả biến môi trường trên hệ thống với lệnh env. Danh sách dài, pipe qua more dễ đọc:
$ env | more
TERM=xterm-256color
LESSOPEN=||/usr/bin/lesspipe.sh %s
USER=seth
SUDO_EDITOR=emacs
WWW_HOME=https://mirror.lagoon.nc/pub/slackware/slackware64-current/ChangeLog.txt
VISUAL=emacs
DISPLAY=:0
PS1=$
XDG_DATA_DIRS=/home/seth/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin
GDMSESSION=gnome
MAIL=/var/spool/mail/seth
[...]
Biến môi trường hữu ích khi muốn ghi đè cài đặt mặc định, hoặc quản lý cài đặt mới hệ thống không tự tạo. Ví dụ, khi gõ lệnh, máy biết tìm ứng dụng tương ứng vì biến môi trường PATH báo nơi tìm. Biến này liệt kê thư mục hợp lệ cho OS tìm lệnh, dù lệnh là ls hay cp, hoặc app đồ họa như Firefox, Lutris, hoặc bất cứ gì.
Biến môi trường khác nhau dùng cho hệ thống khác. Biến PATH quan trọng cho terminal emulator, ví dụ, nhưng kém quan trọng cho Java (có path riêng trỏ thư viện Java quan trọng). Tuy nhiên, biến USER dùng bởi vài hệ thống để xác định ai yêu cầu dịch vụ. Ví dụ, nếu trên hệ thống đa user cần check hộp thư cục bộ, lệnh mail biết spool mail nào lấy dựa trên biến MAIL và USER.
Đặt biến môi trường
Thường, chương trình cài, dù dnf Fedora, apt Ubuntu, brew Mac, hoặc cài tùy chỉnh, cập nhật biến môi trường cho ứng dụng mới. Đôi khi, khi cài thứ gì ngoài bộ công cụ dự định của bản phân phối, bạn phải tự quản lý biến môi trường. Hoặc bạn chọn thêm biến môi trường cho sở thích. Nếu quyết định giữ ứng dụng trong thư mục bin trong home, bạn phải thêm thư mục đó vào PATH để OS biết tìm đó khi bạn ra lệnh.
Biến môi trường tạm thời
Bạn thêm vị trí vào path như tạo biến dùng một lần. Nó hoạt động, nhưng chỉ miễn shell dùng sửa path vẫn mở. Ví dụ, mở shell Bash và sửa path hệ thống:
$ export PATH=$PATH:/home/seth/bin
Xác nhận kết quả:
$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin:/home/seth/bin
Đóng phiên:
$ exit
Mở mới và xem biến PATH:
$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin
Biến này quay về trạng thái mặc định vì PATH không được đặt mỗi shell mới. Để vậy, phải cấu hình biến tải mỗi khi shell khởi chạy.
Biến môi trường vĩnh viễn
Bạn đặt biến môi trường bền vững trong file cấu hình shell, phổ biến nhất ~/.bashrc. Nếu bạn sysadmin quản lý nhiều user, cũng đặt biến môi trường trong script đặt trong thư mục /etc/profile.d.
Cú pháp đặt biến bằng file cấu hình giống đặt biến trong shell:
export PATH=$PATH:/snap/bin:/home/seth/bin
Đóng shell hiện tại, hoặc ép tải config mới:
$ . ~/.bashrc
Cuối cùng, xem lại path hệ thống:
$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin:/home/seth/bin
Giờ đã đặt đúng bao gồm thư mục tùy chỉnh thêm.
Khám phá biến môi trường khác
Bạn tạo và thao tác biến môi trường tùy ý, và một số ứng dụng làm chính điều đó. Thực tế này nghĩa là nhiều biến môi trường không được hầu hết ứng dụng dùng, và nếu thêm biến tùy ý, một số có thể không dùng bởi gì cả. Vậy câu hỏi: Làm sao biết biến nào có ý nghĩa?
Câu trả lời nằm trong tài liệu ứng dụng. Ví dụ, để biết tùy chọn cho môi trường Bash chung, đọc tài liệu Bash. Trang man Bash nhắc nhiều biến quan trọng, trang info GNU cho Bash có hai danh sách toàn diện biến môi trường Bourne Shell và Bash hữu ích, và cách dùng từng cái.
Ví dụ, trong danh sách info page:
'HISTCONTROL'
A colon-separated list of values controlling how commands are saved
on the history list. If the list of values includes 'ignorespace',
lines which begin with a space character are not saved in the
history list. A value of 'ignoredups' causes lines which match the
previous history entry to not be saved. A value of 'ignoreboth' is
shorthand for 'ignorespace' and 'ignoredups'.
[...]
Đầu ra này nói biến môi trường HISTCONTROL kiểm soát cách lịch sử Bash trình bày, và giá trị nào bạn dùng tùy chỉnh trải nghiệm. Ví dụ, giá trị ignoredups bảo đầu ra lệnh history bỏ qua dòng trùng lặp.
Bạn test dễ dàng. Trước, chạy cùng lệnh hai lần liên tiếp:
$ echo "hello world"
hello world
$ echo "hello world"
hello world
Xem lịch sử, hoặc ít nhất mục gần nhất:
$ history | tail -5
996 man bash
997 info bash
998 echo "hello world"
999 echo "hello world"
1000 history
Bạn thấy mục trùng lặp thực sự liệt kê.
Đặt biến môi trường mới trong .bashrc dựa trên đọc info page:
export HISTCONTROL=$HISTCONTROL:ignorespace:ignoredups
Lưu và nạp config mới:
$ source ~/.bashrc
Chạy hai lệnh hai lần liên tiếp:
$ echo "hello once"
hello once
$ echo "hello once"
hello once
Xem mục gần nhất lịch sử:
$ history | tail -5
1000 history
1001 emacs ~/.bashrc
1002 source ~/.bashrc
1003 echo "hello once"
1004 history
Mục trùng lặp giờ gộp thành một mục vì biến môi trường mới, đúng như info page chỉ định.
Tìm biến môi trường liên quan thường là đọc tài liệu ứng dụng bạn muốn ảnh hưởng. Hầu hết biến môi trường cụ thể cho nhu cầu chạy trơn tru của một ứng dụng. Với mục chung, tài liệu shell là nơi logic. Nếu bạn viết script/ứng dụng yêu cầu biến môi trường mới, hãy định nghĩa biến đó trong tài liệu của bạn.