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


9

Tôi đang chạy Red Hat Linux Enterprise 5; Tôi luôn luôn sử dụng lệnh export để đặt các biến môi trường.

Có cách nào khác để đặt biến môi trường không và ưu điểm / nhược điểm của chúng là gì?

Câu trả lời:


16

Đây là một đoạn trích từ trang Bash man:

export [-fn] [name [= word]] ...
export -p
Các tên được cung cấp được đánh dấu để xuất tự động sang môi trường của các lệnh được thực hiện sau đó. Nếu tùy chọn -f được đưa ra, các tên tham chiếu đến các hàm ...

Nếu bạn chỉ cần biến trong môi trường hiện tại, thì không cần sử dụng xuất.

var=value

Biên tập:

Không xuất khẩu: chỉ môi trường hiện tại. Với xuất khẩu: môi trường hiện tại và môi trường trẻ em.

Đây là một minh chứng về ảnh hưởng của xuất khẩu đối với tính khả dụng của một biến trong môi trường con và những thay đổi trong môi trường con không ảnh hưởng đến cha mẹ:

$ var1=123
$ export var2=456
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []
$ var3=789 bash -c 'echo "child [$var1] [$var2] [$var3]"; var1=111; var2=222; var3=333; echo "child [$var1] [$var2] [$var3]"'
child [] [456] [789]
child [111] [222] [333]
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []

Sau tiếng vang đầu tiên ( echo "parent...") bạn thấy "123" và "456" vì cả hai var1var2đang hoạt động trong môi trường hiện tại. Bạn không thấy giá trị var3vì nó chưa được đặt.

Sau khi dòng bắt đầu " var3=..." bạn không thấy giá trị var1vì nó không được xuất. Bạn làm thấy giá trị cho var2bởi vì nó đã được xuất khẩu. Bạn thấy giá trị cho var3vì nó đã được đặt ra cho môi trường con chỉ .

( bash -ctương đương với việc chạy tập lệnh có nội dung của đối số cho -ctùy chọn. Tập lệnh hoặc tập lệnh thực thi khác hoặc, trong trường hợp này, đối số bash -ctrở thành con của môi trường hiện tại, do đó, tất nhiên, là đứa trẻ cha mẹ.)

Trong "script", các giá trị của biến được thay đổi. Bây giờ nó xuất ra những giá trị mới.

Khi "tập lệnh" kết thúc, việc thực thi trở về môi trường cha (dòng lệnh trong trường hợp này). Sau tiếng vang cuối cùng, bạn thấy các giá trị ban đầu vì những thay đổi được thực hiện trong môi trường con không ảnh hưởng đến cha mẹ.


Điều gì có nghĩa là "trong môi trường hiện tại"? Kịch bản bash hiện tại hay?
George2

1
Có, nó có nghĩa là "trong tập lệnh hiện tại" hoặc "trong phiên tương tác hiện tại". Vì vậy, loại trừ các tập tin thực thi hoặc tập lệnh được chạy từ bên trong tập lệnh hiện tại hoặc phiên tương tác. Đó là mục đích của export- để tạo ra các biến có sẵn cho các môi trường con này.
Tạm dừng cho đến khi có thông báo mới.

Tôi tìm thấy một số xung đột từ những gì bạn nói. :-) Bạn đã nói "Vì vậy, loại trừ các tập lệnh hoặc tập lệnh", hãy chú ý đến "loại trừ", nhưng trong những gì bạn đã trích dẫn, bạn đã đề cập "Các tên được cung cấp được đánh dấu để xuất tự động vào môi trường của các lệnh được thực hiện sau đó." - nó được "bao gồm" (tự động xuất sang hoặc tác động) và không "loại trừ". Tôi bối rối, bạn có thể làm rõ?
George2

1
@ George2: Xem câu trả lời chỉnh sửa của tôi để biết thêm thông tin.
Tạm dừng cho đến khi có thông báo mới.

3

Bạn nói thế

Tôi luôn luôn sử dụng lệnh export để đặt biến môi trường

Theo cách bạn nói, có vẻ như bạn đang thực sự cố gắng hỏi làm thế nào để bạn tạo ra một biến môi trường vẫn tồn tại. Để làm điều đó sẽ yêu cầu bạn đặt export VAR="foo"câu lệnh của mình vào tệp $ HOME / .bash_profile (nếu bạn đang sử dụng bash). Nếu bạn muốn biến môi trường đó tồn tại cho tất cả người dùng trừ root, thì hãy thêm nó vào / etc / profile. Nếu bạn cũng muốn nó được thêm cho người dùng root, thì hãy đặt nó trong /root/.bash_profile.

Điều này sẽ làm việc cho tất cả các shell đăng nhập trong đó bash là shell được lựa chọn. Đối với shell không đăng nhập, bạn cần sử dụng .bashrc. Tôi không có cái nhìn sâu sắc để cung cấp cho các shell khác: D


2
Bạn có thể muốn đọc lại phần của trang man Bash khi các tệp đó có nguồn gốc.
Tạm dừng cho đến khi có thông báo mới.

1
Yup ... Tôi đã đăng nhập và tương tác lẫn lộn. Chỉnh sửa câu trả lời của tôi để phản ánh. Cảm ơn vì sự đúng đắn của bạn!
cá voi

"Làm cho một biến môi trường vẫn tồn tại" - điều gì có nghĩa là vẫn tồn tại?
George2

1
"Kiên trì" có nghĩa là bạn muốn biến này có giá trị này mỗi khi bắt đầu trình bao. Có thể hoặc không cần thiết phải xuất biến tùy thuộc vào mục đích của nó là gì.
Tạm dừng cho đến khi có thông báo mới.

1
Điều đó có nghĩa là bạn đã không làm cho nó bền bỉ. Hãy thử làm những gì cá voi mô tả.
Tạm dừng cho đến khi có thông báo mới.

1

xuất khẩu là cách đơn giản nhất để làm điều đó, vậy tại sao không để nó ở đó?

export VARIABLE=value    # for Bourne, bash, and similar shells
setenv VARIABLE value    # for csh and similar shells

2
Vỏ Bourne yêu cầu VARIABLE = value; xuất khẩu VARIABLE
mpez0

1
Điều này cũng sẽ hoạt động ...
BloodPhilia

@BloodPhilia, đối với bash, chỉ có một cách để đặt biến môi trường?
George2

1
@ George2 - Khi sử dụng VARIABLE = value, bạn đang tạo một biến cục bộ đi sau khi thực thi tập lệnh hiện tại. Khi sử dụng xuất, các quy trình con kế thừa các giá trị biến từ quy trình cha của chúng. Ví dụ: FOO=BAR; executethisprogram Chương trình executethisprogramS NOT KHÔNG biết giá trị của biến FOO. Mặt khác, khi sử dụng: FOO=BAR; export FOO; executethisprogram Chương trình executethisprogramSILL biết giá trị của biến FOO.
BloodPhilia

1
chương trình thực thi không phải là một quy trình con của "xuất FOO". Đó là một quy trình con (con) của tập lệnh gọi nó hoặc trình bao (dòng lệnh) tương tác. export FOOlà một lệnh đánh dấu biến FOOđể nó có thể được truy cập bởi các tiến trình con của enConnionment trong đó lệnh được ban hành. Cha mẹ đó có thể là một tập lệnh hoặc một vỏ tương tác.
Tạm dừng cho đến khi có thông báo mới.

1

Bạn cũng có thể làm một cái gì đó như thế này:

VAR=val application

Ví dụ:

LANG=C ls --help

đầu ra bằng tiếng Anh.

LANG=pl_PL ls --help

đầu ra bằng tiếng Ba Lan (nếu có).

Trước đây, bạn không thể xuất VAL = val. Bạn phải

VAL=val; export VAL

Tôi bối rối về "VAR = val application", nghĩa là val và nghĩa là gì?
George2

2
Các ví dụ này đặt giá trị của biến cho môi trường con ( lsví dụ) mà không ảnh hưởng đến giá trị của biến đó trong môi trường hiện tại (cha mẹ).
Tạm dừng cho đến khi có thông báo mới.

Ls là môi trường con cái gì? Tôi bị bối rối.
George2

1
lslà một đứa con của quá trình mà nó được chạy. Nếu tôi gõ lstại một dấu nhắc lệnh, shell tương tác là cha và lslà con. Nếu tôi có một tập lệnh sử dụng lsthì tập lệnh là cha mẹ và lslà con.
Tạm dừng cho đến khi có thông báo mới.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.