Xuất khẩu làm gì trong BASH? [bản sao]


75

Bản sao có thể có:
Sự khác biệt giữa xuất bản a = b và xuất khẩu a = bv trong bash

Thật khó để thừa nhận, nhưng tôi chưa bao giờ thực sự hiểu chính xác những gì exportlàm với một biến môi trường. Tôi biết rằng nếu tôi không xuất một biến, đôi khi tôi không thể thấy nó trong các quy trình con, nhưng đôi khi có vẻ như tôi có thể. Điều gì đang thực sự xảy ra khi tôi nói

export foo=5

và khi nào tôi không nên xuất một biến?


Đây là một liên kết đến ít nhất một câu hỏi hữu ích khác về chủ đề này: superuser.com/questions/143413/linux-en môi-biến ... vì trớ trêu thay câu hỏi này là câu hỏi đầu tiên xuất hiện trên Google cho truy vấn của tôi về xuất khẩu trong bash .
Ogre Psalm33


Một cách sử dụng phổ biến là thêm các exportcâu lệnh vào .bashrc / .bash_profile để tạo các biến toàn cục liên tục tương tự như $HOME.
Evan Plaice

Cẩn thận, có nhiều điều cho câu chuyện này hơn ban đầu xuất hiện. Tôi mời bạn kiểm tra câu trả lời của tôi.
jasonleonhard

Câu trả lời:


15

Từ man bash:

XUNG QUANH

Khi một chương trình được gọi, nó được cung cấp một mảng các chuỗi được gọi là môi trường. Đây là danh sách các cặp tên-giá trị, có dạng tên = giá trị.

Shell cung cấp một số cách để thao túng môi trường. Khi gọi, shell sẽ quét môi trường của chính nó và tạo một tham số cho mỗi tên được tìm thấy, tự động đánh dấu nó để xuất sang các tiến trình con. Các lệnh đã thực hiện kế thừa môi trường. Các lệnh exportdeclare -xcho phép các tham số và chức năng được thêm vào và xóa khỏi môi trường. Nếu giá trị của một tham số trong môi trường bị thay đổi, giá trị mới sẽ trở thành một phần của môi trường, thay thế giá trị cũ. Môi trường được kế thừa bởi bất kỳ lệnh thực thi nào bao gồm môi trường ban đầu của shell, có giá trị có thể được sửa đổi trong shell, trừ bất kỳ cặp nào bị xóa bởi unset lệnh, cộng với bất kỳ bổ sung nào thông qua xuất và declare -xlệnh.


73
IMHO dán sao chép một đoạn trích từ tài liệu mà không cần thêm bất kỳ nỗ lực giải thích nào.
Artur

29
Đoạn trích đó không rõ ràng lắm và thật lòng tôi không hiểu chuyện gì đang xảy ra.
Trismegistos

4
@Artur: ngược lại: nếu tài liệu (trích từ tài liệu) trả lời một câu hỏi, tôi không muốn có thêm lời giải thích.
René Nyffalanger

1
@ RenéNyffalanger nhưng có vẻ như không phải vậy. Ít nhất, tôi đã không nhận được nó cho đến khi tôi đọc được câu trả lời của BloodPhilia nên được đánh dấu là chấp nhận.
Vladislav Rastrusny

1
Tôi tin rằng những điểm mà Artur và Trismegistos đang làm là bất cứ ai cũng có thể sao chép dán, nó không phải lúc nào cũng đủ, làm rõ và cung cấp một câu trả lời tốt. Thật tốt khi sao chép dán một số tài liệu hoặc cung cấp một liên kết, trên thực tế nó được khuyến khích, nhưng cần có một số giải thích chất lượng bổ sung. Hơn nữa, lời giải thích đó có thể dễ dàng bị bỏ qua bởi những người như RenéNyffalanger nếu họ không cần nó, nhưng nó sẽ ở đó cho những người sẽ được hưởng lợi từ nó. Tất cả chúng ta đều cố gắng học hỏi và có những cách khác nhau để có được sự hiểu biết, điều này giúp bao quát nhiều cách học khác nhau và sẽ cải thiện xếp hạng của bạn.
jasonleonhard

99

Các biến được xuất được truyền cho các tiến trình con, các biến không xuất không.


Bạn có thể chỉ ra bất kỳ tài liệu để ảnh hưởng. Tôi đang tìm kiếm nhiều thông tin hơn thế. Chẳng hạn, một biến chỉ cần được xuất một lần, hoặc bạn cần xuất nó sau mỗi thay đổi, v.v.
Chas. Owens

1
Bạn có thể kiểm tra điều này: superuser.com/questions/143413/linux-en môi
BloodPhilia

3
Bạn có thể xác minh điều này bằng cách thêm một cái gì đó cho một con đường (nói với PYTHONPATH) và sau đó lưu ý rằng mặc dù bạn có thể echo $PYTHONPATHnó không được công nhận bởi python hoặc bash script cho đến khi bạn export
Kaushik Ghose

Câu trả lời này dường như cũng không hoàn toàn đúng. Các shell con Bash, chẳng hạn, là cho các tiến trình con (theo $BASHPID) và tuy nhiên bạn có thể đọc các biến không được báo cáo từ shell cha. Bằng chứng đơn giản: x="y"; echo "$BASHPID: $x"; (echo "$BASHPID: $x") Tôi đoán rằng đây là trường hợp đặc biệt xảy ra khi tiến trình con là lớp vỏ phụ.
JepZ

20

Khi bạn sử dụng export, bạn đang thêm biến vào danh sách biến môi trường của shell trong đó lệnh export được gọi và tất cả các biến môi trường của shell được truyền cho các tiến trình con, đó là lý do tại sao bạn có thể sử dụng nó.

Khi bạn hoàn thành shell, môi trường của nó bị hủy, đó là lý do tại sao các biến môi trường được khai báo và xuất khi đăng nhập, ví dụ như trong tệp .bashrc

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.