Thứ hai, 03/03/2014 | 00:00 GMT+7

Cách đọc và đặt các biến Môi trường và Hệ vỏ trên VPS Linux

Khi tương tác với server của bạn thông qua một phiên shell, có nhiều phần thông tin mà shell của bạn biên dịch để xác định hành vi của nó và quyền truy cập vào tài nguyên. Một số cài đặt này nằm trong cài đặt cấu hình và những cài đặt khác được xác định bởi thông tin user nhập.


Một cách mà shell theo dõi tất cả các cài đặt và chi tiết này là thông qua một khu vực mà nó duy trì được gọi là môi trường . Môi trường là một khu vực mà shell xây dựng mỗi khi nó bắt đầu một phiên có chứa các biến xác định thuộc tính hệ thống.

Trong hướng dẫn này, ta sẽ thảo luận về cách tương tác với môi trường và đọc hoặc đặt các biến môi trường và shell một cách tương tác và thông qua các file cấu hình. Ta sẽ sử dụng VPS Ubuntu 12.04 làm ví dụ, nhưng những chi tiết này phải có liên quan trên bất kỳ hệ thống Linux nào.

Môi trường và các biến môi trường hoạt động như thế nào


Mỗi khi một phiên shell sinh ra, một quá trình sẽ diễn ra để thu thập và biên dịch thông tin có sẵn cho quá trình shell và các quá trình con của nó. Nó lấy dữ liệu cho các cài đặt này từ nhiều file và cài đặt khác nhau trên hệ thống.

Về cơ bản, môi trường cung cấp một phương tiện mà thông qua đó, quy trình shell có thể lấy hoặc cài đặt các cài đặt và đến lượt nó, chuyển những cài đặt này cho các quy trình con của nó.

Môi trường được thực hiện dưới dạng các chuỗi đại diện cho các cặp key-value . Nếu nhiều giá trị được chuyển, chúng thường được phân tách bằng ký tự dấu hai chấm (:). Mỗi cặp thường trông giống như sau:

<pre>
<span class = “highlight”> KEY </span> = <span class = “highlight”> value1 </span>: <span class = “highlight”> value2 <span>: <span class = “highlight”>… <span>
</pre>
Nếu giá trị chứa khoảng trắng quan trọng, các dấu ngoặc kép được sử dụng:
<pre>
<span class = “highlight”> KEY </span> = “<span class =" highlight "> giá trị có dấu cách </span>“
</pre>

Key trong các tình huống này là các biến. Chúng có thể là một trong hai kiểu, biến môi trường hoặc biến shell.

Biến môi trường là các biến được xác định cho shell hiện tại và được kế thừa bởi bất kỳ shell hoặc quy trình con nào. Các biến môi trường được sử dụng để truyền thông tin vào các quá trình được sinh ra từ shell.

Các biến shell là các biến được chứa riêng trong shell mà chúng được cài đặt hoặc định nghĩa. Chúng thường được sử dụng để theo dõi dữ liệu tạm thời, như folder làm việc hiện tại.

Theo quy ước, các loại biến này thường được xác định bằng cách sử dụng tất cả các chữ cái viết hoa. Điều này giúp user phân biệt các biến môi trường trong các bối cảnh khác.

Vỏ in và các biến môi trường


Mỗi phiên shell theo dõi các biến môi trường và shell của chính nó. Ta có thể truy cập chúng theo một vài cách khác nhau.

Ta có thể xem danh sách tất cả các biến môi trường của bạn bằng cách sử dụng lệnh env hoặc printenv . Ở trạng thái mặc định, chúng sẽ hoạt động hoàn toàn giống nhau:

printenv 

SHELL=/bin/bash TERM=xterm USER=demouser 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:su=37;41:sg=30;43:ca:... MAIL=/var/mail/demouser PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games PWD=/home/demouser LANG=en_US.UTF-8 SHLVL=1 HOME=/home/demouser LOGNAME=demouser LESSOPEN=| /usr/bin/lesspipe %s LESSCLOSE=/usr/bin/lesspipe %s %s _=/usr/bin/printenv 

Điều này khá điển hình cho kết quả của cả printenvenv . Sự khác biệt giữa hai lệnh chỉ rõ ràng trong chức năng cụ thể hơn của chúng. Ví dụ: với printenv , bạn có thể yêu cầu giá trị của các biến riêng lẻ:

printenv SHELL 

/bin/bash 

Mặt khác, env cho phép của bạn thay đổi môi trường mà các chương trình chạy trong bằng cách thông qua một tập hợp các định nghĩa biến thành một lệnh như thế này:

env VAR1="blahblah" command_to_run command_options 

Vì, như ta đã học ở trên, các quy trình con thường kế thừa các biến môi trường của quy trình mẹ, điều này mang lại cho bạn cơ hội overrides các giá trị hoặc thêm các biến bổ sung cho quy trình con.

Như bạn thấy từ kết quả của lệnh printenv của ta , có khá nhiều biến môi trường được cài đặt thông qua các file hệ thống và quy trình của ta mà không cần đầu vào của ta .

Chúng hiển thị các biến môi trường, nhưng làm thế nào để ta thấy các biến shell?

Lệnh set được dùng cho việc này. Nếu ta nhập set mà không có bất kỳ tham số bổ sung nào, ta sẽ nhận được danh sách tất cả các biến shell, biến môi trường, biến local và hàm shell:

set 

BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath BASH_ALIASES=() BASH_ARGC=() BASH_ARGV=() BASH_CMDS=() . . . 

Đây thường là một danh sách lớn. Bạn có thể cần đưa nó vào một chương trình máy nhắn tin để dễ dàng xử lý số lượng kết quả :

set | less 

Số lượng thông tin bổ sung mà ta nhận được trở lại là một chút quá tải. Ví dụ, ta có thể không cần biết tất cả các hàm bash được định nghĩa.

Ta có thể dọn dẹp kết quả bằng cách chỉ định rằng set sẽ hoạt động ở chế độ POSIX, chế độ này sẽ không in các hàm shell. Ta có thể thực thi điều này trong một shell phụ để nó không thay đổi môi trường hiện tại của ta :

(set -o posix; set) 

Điều này sẽ liệt kê tất cả các biến môi trường và biến shell được xác định.

Ta có thể thử so sánh kết quả kết quả này với kết quả kết quả của các lệnh env hoặc printenv để cố gắng lấy danh sách chỉ các biến shell, nhưng điều này sẽ không hoàn hảo do các cách khác nhau mà các lệnh này xuất ra thông tin:

comm -23 <(set -o posix; set | sort) <(env | sort) 

Điều này có thể sẽ vẫn bao gồm một số biến môi trường, do thực tế là lệnh set xuất ra các giá trị được trích dẫn, trong khi các lệnh printenvenv không trích dẫn các giá trị của chuỗi.

Điều này vẫn sẽ cung cấp cho bạn một ý tưởng tốt về các biến môi trường và shell được đặt trong phiên của bạn.

Các biến này được sử dụng cho tất cả các loại. Chúng cung cấp một cách thay thế để đặt các giá trị liên tục cho phiên giữa các quy trình mà không cần ghi các thay đổi vào file .

Các biến môi trường và vỏ phổ biến


Một số biến môi trường và biến shell rất hữu ích và được tham chiếu khá thường xuyên.
Dưới đây là một số biến môi trường phổ biến mà bạn sẽ gặp:

  • SHELL : Điều này mô tả shell sẽ thông dịch bất kỳ lệnh nào bạn nhập vào. Trong hầu hết các trường hợp, điều này sẽ được bash theo mặc định, nhưng các giá trị khác có thể được đặt nếu bạn thích các tùy chọn khác.
  • TERM : Điều này chỉ định loại terminal để mô phỏng khi chạy shell . Các terminal phần cứng khác nhau có thể được mô phỏng cho các yêu cầu hoạt động khác nhau. Bạn thường sẽ không cần phải lo lắng về điều này.
  • USER : User đã đăng nhập hiện tại.
  • PWD : Thư mục làm việc hiện tại.
  • OLDPWD : Thư mục làm việc trước đó. Điều này được giữ bởi shell để chuyển về folder trước đó của bạn bằng cách chạy cd - .
  • LS_COLORS : Điều này xác định mã màu được sử dụng để tùy chọn thêm kết quả màu vào ls . Điều này được sử dụng để phân biệt các loại file khác nhau và cung cấp nhanh hơn thông tin cho user .
  • MAIL : Đường dẫn đến hộp thư của user hiện tại.
  • PATH : Danh sách các folder mà hệ thống sẽ kiểm tra khi tìm kiếm lệnh. Khi user nhập một lệnh, hệ thống sẽ kiểm tra các folder theo thứ tự này để thực thi.
  • LANG : Cài đặt ngôn ngữ và bản địa hóa hiện tại, bao gồm cả mã hóa ký tự.
  • HOME : Thư mục chính của user hiện tại.
  • _ : Lệnh được thực hiện trước đó mới nhất .

Ngoài các biến môi trường này, một số biến shell mà bạn thường thấy là:

  • BASHOPTS : Danh sách các tùy chọn đã được sử dụng khi thực thi bash. Điều này có thể hữu ích để tìm hiểu xem môi trường shell có hoạt động theo cách bạn muốn hay không.
  • BASH_VERSION : Phiên bản bash đang được thực thi, ở dạng con người có thể đọc được.
  • BASH_VERSINFO : Phiên bản của bash, ở kết quả máy đọc được.
  • COLUMNS : Số lượng cột rộng đang được sử dụng để vẽ kết quả trên màn hình.
  • DIRSTACK : Ngăn xếp các folder có sẵn với các pushdpopd .
  • HISTFILESIZE : Số dòng lịch sử lệnh được lưu trữ vào một file .
  • HISTSIZE : Số dòng lịch sử lệnh được phép trong bộ nhớ.
  • HOSTNAME : Tên máy tính của máy tính tại thời điểm này.
  • IFS : Dấu tách trường bên trong để phân tách đầu vào trên dòng lệnh. Theo mặc định, đây là khoảng trắng.
  • PS1 : Định nghĩa dấu nhắc lệnh chính. Điều này được sử dụng để xác định dấu nhắc của bạn trông như thế nào khi bạn bắt đầu một phiên shell . PS2 được sử dụng để khai báo các dấu nhắc phụ khi một lệnh kéo dài nhiều dòng.
  • SHELLOPTS : Các tùy chọn vỏ có thể được đặt bằng tùy chọn set .
  • UID : UID của user hiện tại.

Đặt các biến Shell và Môi trường


Để hiểu rõ hơn về sự khác biệt giữa biến shell và biến môi trường, cũng như để giới thiệu cú pháp cài đặt các biến này, ta sẽ làm một minh chứng nhỏ.

Tạo các biến Shell


Ta sẽ bắt đầu bằng cách xác định một biến shell trong phiên hiện tại của ta . Điều này rất dễ thực hiện; ta chỉ cần xác định một tên và một giá trị. Ta sẽ tuân theo quy ước giữ tất cả các chữ hoa cho tên biến và đặt nó thành một chuỗi đơn giản.

TEST_VAR='Hello World!' 

Ở đây, ta đã sử dụng các dấu ngoặc kép vì giá trị của biến chứa một khoảng trắng. Hơn nữa, ta đã sử dụng các dấu ngoặc kép đơn vì dấu chấm than là một ký tự đặc biệt trong bash shell thường mở rộng đến lịch sử bash nếu nó không được thoát hoặc được đặt trong các dấu nháy đơn.

Bây giờ ta có một biến shell. Biến này có sẵn trong phiên hiện tại của ta , nhưng sẽ không được chuyển cho các quy trình con.

Ta có thể thấy điều này bằng cách gắn xám cho biến mới của ta trong kết quả set :

set | grep TEST_VAR 

TEST_VAR='Hello World!' 

Ta có thể xác minh đây không phải là một biến môi trường bằng cách thử điều tương tự với printenv :

printenv | grep TEST_VAR 

Không có kết quả nào nên được trả lại.

Hãy coi đây là một cơ hội để chứng minh một cách truy cập giá trị của bất kỳ biến shell hoặc môi trường nào.

echo $TEST_VAR 

Hello World! 

Như bạn thấy , hãy tham chiếu giá trị của một biến bằng cách đặt trước nó bằng dấu $ . Shell coi điều này nghĩa là nó sẽ thay thế giá trị của biến khi nó gặp phải điều này.

Vì vậy, bây giờ ta có một biến shell. Nó không nên được chuyển cho bất kỳ quy trình con nào. Ta có thể đẻ trứng một vỏ bash mới từ trong vòng một hiện tại của ta để chứng minh:

bash echo $TEST_VAR 

Nếu ta gõ bash để tạo ra một shell con và sau đó cố gắng truy cập nội dung của biến, sẽ không có gì được trả về. Đây là những gì ta mong đợi.

Quay lại shell ban đầu của ta bằng lệnh exit :

exit 

Tạo các biến môi trường


Bây giờ, hãy biến biến shell của ta thành một biến môi trường. Ta có thể làm điều này bằng cách xuất biến. Lệnh để thực hiện được đặt tên thích hợp:

export TEST_VAR 

Điều này sẽ thay đổi biến của ta thành một biến môi trường. Ta có thể kiểm tra bằng cách kiểm tra lại danh sách môi trường của ta :

printenv | grep TEST_VAR 

TEST_VAR=Hello World! 

Lần này, biến của ta xuất hiện. Hãy thử lại thử nghiệm với shell con của ta :

bash echo $TEST_VAR 

Hello World! 

Tuyệt quá! Shell con của ta đã nhận được biến do cha của nó cài đặt . Trước khi thoát khỏi shell con này, hãy thử xuất một biến khác. Ta có thể cài đặt các biến môi trường trong một bước duy nhất như sau:

export NEW_VAR="Testing export" 

Kiểm tra xem nó đã được xuất dưới dạng biến môi trường chưa:

printenv | grep NEW_VAR 

NEW_VAR=Testing export 

Bây giờ, hãy thoát trở lại shell ban đầu của ta :

exit 

Hãy xem liệu biến mới của ta có khả dụng không:

echo $NEW_VAR 

Không có gì được trả lại.

Điều này là do các biến môi trường chỉ được chuyển cho các quy trình con. Không có một cách tích hợp nào để cài đặt các biến môi trường của shell cha. Điều này tốt trong hầu hết các trường hợp và ngăn các chương trình ảnh hưởng đến môi trường hoạt động mà chúng được gọi.

Biến NEW_VAR được đặt làm biến môi trường trong shell con của ta . Biến này sẽ có sẵn cho chính nó và bất kỳ shell và quy trình con nào của . Khi ta quay trở lại lớp vỏ chính của bạn , môi trường đó đã bị phá hủy.

Hạ hạng và Bỏ cài đặt các biến


Ta vẫn có biến TEST_VAR được định nghĩa là một biến môi trường. Ta có thể thay đổi nó trở lại thành một biến shell bằng lệnh :

export -n TEST_VAR 

Nó không còn là một biến môi trường:

printenv | grep TEST_VAR 

Tuy nhiên, nó vẫn là một biến shell:

set | grep TEST_VAR 

TEST_VAR='Hello World!' 

Nếu ta muốn hủy đặt hoàn toàn một biến, shell hoặc môi trường, ta có thể làm như vậy với lệnh unset :

unset TEST_VAR 

Ta có thể xác minh nó không còn được đặt nữa:

echo $TEST_VAR 

Không có gì được trả về vì biến chưa được đặt.

Đặt các biến môi trường khi đăng nhập


Ta đã đề cập rằng nhiều chương trình sử dụng các biến môi trường để quyết định các chi tiết cụ thể về cách hoạt động. Ta không muốn phải cài đặt các biến quan trọng mỗi khi ta bắt đầu một phiên shell mới và ta đã thấy có bao nhiêu biến đã được đặt khi đăng nhập, vậy làm cách nào để ta tạo và xác định các biến tự động?

Đây thực sự là một vấn đề phức tạp hơn có vẻ như ban đầu, do có rất nhiều file cấu hình mà bash shell đọc tùy thuộc vào cách nó được khởi động.

Sự khác biệt giữa các phiên đăng nhập, không đăng nhập, tương tác và không tương tác


Bash shell đọc các file cấu hình khác nhau tùy thuộc vào cách phiên bắt đầu.

Một sự khác biệt giữa các phiên khác nhau là liệu shell đang được tạo ra dưới dạng phiên "đăng nhập" hay "không đăng nhập".

Shell đăng nhập là một phiên shell bắt đầu bằng cách xác thực user . Nếu bạn đang đăng nhập vào một phiên terminal hoặc thông qua SSH và xác thực, phiên shell của bạn sẽ được đặt làm shell “đăng nhập”.

Nếu bạn bắt đầu một phiên shell mới từ bên trong phiên đã xác thực của bạn , giống như ta đã làm bằng cách gọi lệnh bash từ terminal , một phiên shell không đăng nhập sẽ được bắt đầu. Bạn đã không được hỏi về chi tiết xác thực của bạn khi bạn bắt đầu shell con của bạn .

Một sự khác biệt khác có thể được thực hiện là liệu một phiên shell là tương tác hay không tương tác.

Phiên shell tương tác là một phiên shell được gắn vào một terminal . Phiên shell không tương tác là phiên không được gắn với phiên terminal .

Vì vậy, mỗi phiên shell được gọi là đăng nhập hoặc không đăng nhập và tương tác hoặc không tương tác.

Một phiên thông thường bắt đầu bằng SSH thường là một shell đăng nhập tương tác. Một tập lệnh chạy từ dòng lệnh thường được chạy trong một shell không tương tác, không đăng nhập. Một phiên terminal có thể là bất kỳ sự kết hợp nào của hai thuộc tính này.

Cho dù một phiên shell được gọi là shell đăng nhập hay không đăng nhập có ý nghĩa về các file được đọc để khởi tạo phiên shell .

Một phiên bắt đầu như một phiên đăng nhập sẽ đọc chi tiết cấu hình từ file /etc/profile trước tiên. Sau đó, nó sẽ tìm kiếm file cấu hình shell đăng nhập đầu tiên trong folder chính của user để lấy chi tiết cấu hình dành riêng cho user .

Nó đọc file đầu tiên mà nó có thể tìm ra từ ~/.bash_profile , ~/.bash_login~/.profile và không đọc thêm các file nào.

Ngược lại, một phiên được định nghĩa là shell không đăng nhập sẽ đọc /etc/bash.bashrc và sau đó là file ~/.bashrc dành riêng cho user để xây dựng môi trường của nó.

Các shell không tương tác đọc biến môi trường được gọi là BASH_ENV và đọc file được chỉ định để xác định môi trường mới.

Thực hiện các biến môi trường


Như bạn thấy , có rất nhiều file khác nhau mà ta thường cần xem xét để đặt cài đặt của bạn .

Điều này cung cấp rất nhiều tính linh hoạt có thể trợ giúp trong các tình huống cụ thể mà ta muốn các cài đặt nhất định trong shell đăng nhập và các cài đặt khác trong shell không đăng nhập. Tuy nhiên, hầu hết thời gian ta sẽ muốn các cài đặt giống nhau trong cả hai trường hợp.

May mắn là hầu hết các bản phân phối Linux đều cấu hình file cấu hình đăng nhập để tạo nguồn cho file cấu hình không đăng nhập. Điều này nghĩa là bạn có thể xác định các biến môi trường mà bạn muốn trong cả hai bên trong các file cấu hình không đăng nhập. Sau đó, chúng sẽ được đọc trong cả hai tình huống.

Ta thường sẽ cài đặt các biến môi trường dành riêng cho user và ta thường muốn cài đặt của bạn có sẵn trong cả shell đăng nhập và không đăng nhập. Điều này nghĩa là nơi để xác định các biến này là trong file ~/.bashrc .

Mở file này ngay bây giờ:

nano ~/.bashrc 

Điều này rất có thể sẽ chứa khá nhiều dữ liệu. Hầu hết các định nghĩa ở đây là để cài đặt các tùy chọn bash, không liên quan đến các biến môi trường. Bạn có thể đặt các biến môi trường giống như cách bạn làm từ dòng lệnh:

export VARNAME=value 

Bất kỳ biến môi trường mới nào cũng có thể được thêm vào bất kỳ đâu trong file ~/.bashrc , miễn là chúng không được đặt ở giữa lệnh khác hoặc vòng lặp for. Sau đó, ta có thể lưu file . Lần sau khi bạn bắt đầu một phiên shell, khai báo biến môi trường của bạn sẽ được đọc và chuyển cho môi trường shell. Bạn có thể buộc phiên hiện tại của bạn đọc file ngay bây giờ bằng lệnh :

source ~/.bashrc 

Nếu bạn cần đặt các biến trên toàn hệ thống, bạn có thể nghĩ đến việc thêm chúng vào /etc/profile , /etc/bash.bashrc hoặc /etc/environment .

Kết luận


Các biến môi trường và shell luôn hiện diện trong các phiên shell của bạn và có thể rất hữu ích. Chúng là một cách thú vị để quy trình cha đặt chi tiết cấu hình cho các quy trình con của nó và là một cách cài đặt các tùy chọn bên ngoài file .

Điều này có nhiều lợi thế trong các tình huống cụ thể. Ví dụ, một số cơ chế triển khai dựa vào các biến môi trường để cấu hình thông tin xác thực. Điều này rất hữu ích vì nó không yêu cầu giữ những thứ này trong các file mà các bên bên ngoài có thể nhìn thấy.

Có rất nhiều kịch bản khác, trần tục hơn, nhưng phổ biến hơn, nơi bạn cần đọc hoặc thay đổi môi trường của hệ thống của bạn . Những công cụ và kỹ thuật này sẽ cung cấp cho bạn nền tảng tốt để thực hiện những thay đổi này và sử dụng chúng một cách chính xác.

<div class = “author”> Bởi Justin Ellingwood </div>


Tags:

Các tin liên quan

Cách đọc và đặt các biến Môi trường và Hệ vỏ trên VPS Linux
2014-03-03
Cách sử dụng cd, pwd và ls để khám phá hệ thống tệp trên server Linux
2014-02-28
Cách di chuyển server Linux Phần 1 - Chuẩn bị hệ thống
2014-02-27
Cách di chuyển server Linux Phần 2 - Truyền dữ liệu cốt lõi
2014-02-27
Cách di chuyển server Linux Phần 3 - Các bước cuối cùng
2014-02-27
Cách cài đặt và sử dụng LinuxBrew trên VPS Linux
2014-02-14
cách sử dụng role và môi trường trong Chef để kiểm soát cấu hình server
2014-02-04
Cách cài đặt Chef Server, Workstation và Client trên Phiên bản VPS Ubuntu
2014-01-30
Giới thiệu về Chuyển hướng I / O Linux
2014-01-23
Giới thiệu về Chuyển hướng I / O Linux
2014-01-23