1.13 2005-09-28
Biến môi trường Nó là gì?

Biến môi trường là một đối tượng có tên, chứa thông tin được dùng bởi một hoặc nhiều ứng dụng. Nhiều người dùng (đặc biệt là những người mới làm quen với Linux) cảm thấy nó kỳ lạ và không thể quản lý được. Tuy nhiên, đó là một sai lầm: bằng cách dùng biến môi trường, bạn có thể thay đổi thiết lập cấu hình cho một hoặc nhiều ứng dụng.

Ví dụ quan trọng

Bảng sau liệt kê một số biến được dùng bởi hệ thống Linux và mô tả công dụng của chúng. Những giá trị ví dụ được trình bày bên dưới bảng.

PATH Biến này chứa danh sách các thư mục, cách nhau bởi dấu hai chấm. Đó là danh sách các thư mục hệ thống sẽ kiểm tra để tìm các tập tin thực thi. Nếu bạn nhập tên một tập tin thực thi (ví dụ như ls, rc-update hoặc emerge) nhưng tập tin đó không nằm trong những thư mục được liệt kê, hệ thống sẽ không thực hiện lệnh đó (trừ khi bạn nhập đầy đủ đường dẫn của lệnh, như /bin/ls). ROOTPATH Biến này tương tự như PATH nhưng chỉ liệt kê danh sách những thư mục cần tìm khi người dùng root gọi lệnh. LDPATH Biến này chứa danh sách các thư mục cánh nhau bằng dấu hai chấm, được dùng bởi dynamic linker để tìm các thư viện. MANPATH Biến này chứa danh sách các thư mục cách nhau bằng dấu hai chấm, được dùng bởi man để tìm man page. INFODIR Biến này chứa danh sách các thư mục cách nhau bằng dấu hai chấm, được dùng bởi info để tìm info page. PAGER Biến này chứa đường dẫn chương trình được dùng để xem nội dung tập tin (như less hoặc more). EDITOR Biến này chứa đường dẫn chương trình dùng để thay đổi nội dung tập tin (như nano hoặc vi). KDEDIRS Biến này chứa danh sách các thư mục cách nhau bằng dấu hai chấm, chứa các thông tin đặc trưng của KDE. CLASSPATH Biến này chứa danh sách các thư mục chứa các lớp Java, cách nhau bằng dấu hai chấm. CONFIG_PROTECT Biến này chứa danh sách các thư mục cách nhau bằng khoảng trắng, là danh sách các thư mục cần được Portage bảo vệ tránh bị ghi đè khi cập nhật. CONFIG_PROTECT_MASK Biến này chứa danh sách các thư mục cách nhau bằng khoảng trắng, là danh sách các thư mục không được Portage bảo vệ tránh bị ghi đè khi cập nhật.
Biến Mô tả

Bên dưới là ví dụ định nghĩa các biến trên:

PATH="/bin:/usr/bin:/usr/local/bin:/opt/bin:/usr/games/bin"
ROOTPATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"
LDPATH="/lib:/usr/lib:/usr/local/lib:/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"
MANPATH="/usr/share/man:/usr/local/share/man"
INFODIR="/usr/share/info:/usr/local/share/info"
PAGER="/usr/bin/less"
EDITOR="/usr/bin/vim"
KDEDIRS="/usr"
CLASSPATH="/opt/blackdown-jre-1.4.1/lib/rt.jar:."
CONFIG_PROTECT="/usr/X11R6/lib/X11/xkb /opt/tomcat/conf \
                /usr/kde/3.1/share/config /usr/share/texmf/tex/generic/config/ \
                /usr/share/texmf/tex/platex/config/ /usr/share/config"
CONFIG_PROTECT_MASK="/etc/gconf
Định nghĩa biến toàn cục Thư mục /etc/env.d

Để tập trung các định nghĩa biến, Gentoo giới thiệu thư mục /etc/env.d. Bên trong thư mục này, bạn sẽ thấy các tập tin như 00basic, 05gcc, ... chứa các biến được dùng bởi ứng dụng được đề cập bên trên.

Ví dụ, khi bạn cài đặt gcc, tập tin tên 05gcc được tạo bởi ebuild gcc, chứa định nghĩa các biến sau:

PATH="/usr/i686-pc-linux-gnu/gcc-bin/3.2"
ROOTPATH="/usr/i686-pc-linux-gnu/gcc-bin/3.2"
MANPATH="/usr/share/gcc-data/i686-pc-linux-gnu/3.2/man"
INFOPATH="/usr/share/gcc-data/i686-pc-linux-gnu/3.2/info"
CC="gcc"
CXX="g++"
LDPATH="/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"

Các bản phân phối khác yêu cầu bạn thay đổi biến trong /etc/profile hoặc ở nơi khác. Ngược lại, Gentoo làm mọi việc dễ dàng hơn cho bạn (và cho cả Portage) khi quản lý các biến môi trường mà không cần quan tâm đến vô số tập tin có thể chứa biến môi trường.

Ví dụ, khi cập nhật gcc, tập tin /etc/env.d/05gcc được cập nhật mà không cần bất kỳ sự can thiệp nào của người dùng.

Đây không chỉ làm lợi cho Portage mà còn cho cả bạn, người sử dụng. Đôi khi bạn được yêu cầu đặt một số biến toàn cục. Trong ví dụ sau, chúng tôi đặt biến http_proxy. Thay vì làm rối tung lên tập tin /etc/profile, bạn có thể chỉ cần tạo tập tin (/etc/env.d/99local) và nhập các định nghĩa của bạn vào:

http_proxy="proxy.server.com:8080"

Bằng cách dùng cùng một tập tin cho mọi định nghĩa biến của bạn, bạn có thể có cái nhìn tổng quát về những gì bạn tự định nghĩa.

Chương trình env-update

Một vài tập tin trong /etc/env.d định nghĩa biến PATH. Đó không phải là lỗi: khi bạn chạy env-update, nó sẽ nối tất cả các định nghĩa này lại với nhau trước khi cập nhật biến môi trường của bạn, nhờ đó làm cho việc thêm các biến môi trường riêng khi đóng gói (hoặc tự bạn thêm) dễ dàng hơn mà lại không tác động các giá trị đã có.

Script env-update sẽ nối các giá trị của các tập tin lại theo thứ tự bảng chữ cái tên các tập tin /etc/env.d. Đó là lý do tại sao các tập tin /etc/env.d bắt đầu bằng hai chữ số thập phân.

         00basic        99kde-env       99local
     +-------------+----------------+-------------+
PATH="/bin:/usr/bin:/usr/kde/3.2/bin:/usr/local/bin"

Việc nối các biến không phải luôn xảy ra, chỉ xảy ra với những biến sau: KDEDIRS, PATH, CLASSPATH, LDPATH, MANPATH, INFODIR, INFOPATH, ROOTPATH, CONFIG_PROTECT, CONFIG_PROTECT_MASK, PRELINK_PATHPRELINK_PATH_MASK. Với các biến khác, giá trị mới nhất (theo thứ tự bảng chữ cái tên tập tin trong /etc/env.d) sẽ được dùng.

Khi bạn chạy env-update, script này sẽ tạo mọi biến môi trường và đặt vào /etc/profile.env (được dùng bởi /etc/profile). Nó cũng rút trích các thông tin từ biến LDPATH và tạo /etc/ld.so.conf. Sau đó, nó sẽ gọi ldconfig để tạo lại tập tin /etc/ld.so.cache, được dùng bởi dynamic linker.

Nếu bạn muốn thấy tác động của env-update tức thì, sau khi chạy nó, hãy thực hiện lệnh sau để cập nhật lại biến môi trường của bạn. Nhưng người dùng tự cài đặt Gentoo có lẽ sẽ nhớ ra lệnh này trong các chỉ dẫn cài đặt:

# env-update && source /etc/profile
Lệnh trên chỉ cập nhật các biến trong terminal hiện thời, các console mới và con của nó. Vì thế, nếu bạn đang dùng X11, bạn sẽ cần gõ source /etc/profile trong mỗi terminal mới bạn mở hoặc khởi động lại X để mọi terminal đều được cập nhật mới. Nếu bạn dùng login manager, hãy vào root và gõ /etc/init.d/xdm restart. Nếu không, bạn cần đăng xuất và đăng nhập trở lại vào X để các giá trị mới có tác dụng.
Định nghĩa biến cục bộ User Specific

Bạn không phải luôn muốn định nghĩa biến môi trường cho toàn hệ thống. Ví dụ, bạn có thể muốn thêm /home/my_user/bin và thư mục hiện thời (thư mục bạn đang đứng) vào biến PATH nhưng không muốn những người khác trên hệ thống cũng có y như vậy. Nếu bạn muốn định nghĩa biến môi trường nội bộ, bạn nên dùng ~/.bashrc hoặc ~/.bash_profile:

(Dấu hai chấm theo sau không có thư mục nào có nghĩa là thư mục hiện thời)
PATH="${PATH}:/home/my_user/bin:"

Khi bạn login lần sau, biến PATH sẽ được cập nhật.

Đặc trưng cho phiên làm việc

Đôi khi cần có những định nghĩa biến chặt hơn. Bạn có thể muốn dùng những chương trình từ một thư mục tạm bạn tạo mà không cần gõ đường dẫn đến chương trình đó cũng như không sửa ~/.bashrc vì bạn chỉ cần nó trong một lúc.

Trong trường hợp này, bạn có thể định nghĩa biến PATH trong quá trình làm việc bằng cách dùng lệnh export. Chừng nào bạn chưa log out thì biến PATH sẽ vẫn còn nguyên như bạn mong muốn.

# export PATH="${PATH}:/home/my_user/tmp/usr/bin"